Угловой 8: URL закодированная форма POST - PullRequest
1 голос
/ 06 ноября 2019

Я хочу опубликовать данные формы на сервере, который принимает и возвращает текст / html / xml. Я эффективно пытаюсь эмулировать нормальный URL-адрес в форме POST. Моя функция Angular 8 POST успешно отправляет сообщения (200 OK), но сервер не может понять данные, потому что они в формате JSON, а не в кодировке URL.

Заголовки ответа и запроса находятся в состоянии Content-Type: text/html; Charset=utf-8 и Accept: text/html, application/xhtml+xml, */*, и я добавил responseType: "text" в опции httpClient. Почему серверу все еще отправляются данные в формате JSON, а не данные в кодировке URL?

// obj2 = output from ngForm
// baseUrl2 = server that sends and receives text/html/xml

public postForm(obj2) {
    return this.httpClient
    .post(this.baseUrl2, obj2, {
        headers: new HttpHeaders({
            "Content-Type": "application/x-www-form-urlencoded",
            Accept: "text/html, application/xhtml+xml, */*"
        }),
        responseType: "text"
    })
    .map(data => data);
}

Отправленные данные формы:

{"Form data":{"{\"personsNameText\":\"name9\",\"centreEmailAddressText\":\"name9@name.com\",\"centreTelephoneNumberText\":123456789,\"centreNumberText\":\"ab123\",\"centreNameText\":\"ab123\",\"invoiceText\":\"123456789\",\"currencyText\":\"GBP\",\"amountText\":\"100\",\"cardtypeText\":\"Credit card\",\"commentsText\":\"Comments.\",\"declarationText\":true}":""}}

Что я хочу:

personsNameText=name9?centreEmailAddressText=name9@name.com?centreTelephoneNumberText=123456789?centreNumberText=ab123?centreNameText=ab123?invoiceText=123456789?currencyText=GBP?amountText=100?cardtypeText=Credit card?commentsText=Comments.?declarationText=true

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Я не уверен в типе объекта obj2 здесь, но я предполагаю, что это что-то вроде

interface UserFormData {
  ['Form data']: { [name: string]: value };
}

Вам нужно преобразовать это в FormData перед публикацией. Что-то в этом роде:

const formEncodedObj2 = new FormData();
const obj2Keys = obj2['Form data'];
Object.keys(obj2Keys).forEach(key => formEncodedObj2.append(key, obj2Keys[key]));

А затем отправьте объект formEncodedObj2.

0 голосов
/ 08 ноября 2019

Итак, это решение решило для меня различные проблемы:

  1. Публикация данных x-www-form-urlencoded с использованием форм Angular 8 и HttpClient
  2. Исправление нежелательных закодированных символов
    • Моя конкретная проблема заключалась в том, что уникальная строка проверки содержала амперсанды, которые были преобразованы в объекты HTML, то есть & в &.
// userdata.service.ts

public postForm(obj) {
  return this.httpClient
    .post(this.baseUrl2, obj, {
      headers: new HttpHeaders({
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Referer": "http://referer.com" // Replace with your own.
      }),
      responseType: "text"
    })
    .map(data => data)
    .pipe(
      retry(1),
      catchError(this.handleError)
    );
}

// app.component.ts

PostForm(userdata) {
    // Stringify and convert HTML entity ampersands back to normal ampersands.
    const corrected = JSON.stringify(userdata).replace(/(&)/gm, '&');
    // Convert back to JSON object.
    const corrected2 = JSON.parse(corrected);
    // entries() iterates form key:value pairs, URLSearchParams() is for query strings
    const URLparams = new URLSearchParams(Object.entries(corrected2));
    // Convert to string to post.
    const final = URLparams.toString();
    // Post it
    this.userdataService.postForm(final).subscribe(reponse2 => {
        console.log(reponse2);
    });
}

URLSearchParams () был прорывом и, как предположил Влад, он был абсолютно уверен в типе, с которым имеет дело. Я должен был использовать Типы , чтобы избежать путаницы. Я, вероятно, должен использовать Angular Interceptors , чтобы справиться с манипуляциями персонажем.

...