Типы свойства responsetype несовместимы

Я не могу сделать запрос POST в Angular 5, который принимает text/plain в качестве ответа. Angular вызывает метод, который ожидает JSON в качестве ответа и, следовательно, выдает ошибку, когда ответ приходит при попытке проанализировать ответ.

Я пробовал вызвать метод с параметром {responseType: 'text'}, но код VS показывает это как ошибку, и я также получаю сообщение об ошибке в консоли при компиляции приложения.

Ниже приведен код Angular 5 для запроса POST, который ожидает ответа как text/plain.

this.http
.post<string>(this.loginUrl, this.user, {responseType: 'text'}) // error in this line
.subscribe(
    (data) => this.success(data),
    (error) => this.failure(error)
);

Во время компиляции в консоли отображается следующая ошибка:

ERROR in src/app/login/login.component.ts(47,47): error TS2345: Argument of type '{ responseType: "text"; }' is not assignable to parameter of type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: Ht...'.
  Types of property 'responseType' are incompatible.
    Type '"text"' is not assignable to type '"json"'.
27
0
18 140
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Версия post, принимающая responseType:'text', не является универсальной, поскольку тип результата уже ясен (например, string)

this.http
.post(this.loginUrl, this.user, {responseType: 'text'}) // no generic parameter
.subscribe(
    (data) => this.success(data), // data is string
    (error) => this.failure(error)
);

Я до сих пор не понимаю, что вызвало эту проблему? Почему добавление .post <string> могло разрешить конфликт с reponseType: 'text'?

Logan Wlv 14.09.2018 15:20

@LoganWlv, потому что существует несколько перегрузок, и перегрузка с responseType: 'text' не является универсальной, а общая перегрузка, которая является универсальной, позволяет 'json' только для responseType

Titian Cernicova-Dragomir 14.09.2018 15:24

У меня это не работает в Angular 9, вот что мне пришлось сделать: stackoverflow.com/a/60693216/6410464

atb00ker 15.03.2020 14:11

Просто удалите "нить" из вашего запроса. Попробуй это:

this.http.post(this.loginUrl, this.user, {responseType: 'text'}).subscribe(
    (data) => this.success(data),
    (error) => this.failure(error)
);

Это всего лишь взлом. Я не знаю, было ли возможно лучшее решение в то время, когда я задавал вопрос, но сегодня, безусловно, вы можете сделать stackoverflow.com/a/60693216/6410464

atb00ker 15.03.2020 14:10
this.http.post(this.loginUrl,this.user,{headers:
new HttpHeaders({'content-type':'application/json'}), responseType:'text'})
.subscribe((r)=>{console.log(r)})

Редактировать

Это странно, но создание объекта заголовка отдельно, как показано ниже.

let headerOptions = {
 headers: new HttpHeaders(
     {'content-type':'application/json'}),
       responseType:'text'
 }
this.http.post(this.loginUrl,this.user, headerOptions)
 .subscribe((r)=>{console.log(r)})

вызовет ошибку в коде VS, поэтому идея состоит в том, чтобы передать весь объект во встроенном почтовом запросе, как указано выше, решит ошибку компиляции.

Можете добавить описание?

RtmY 25.03.2019 17:40

Это устранило проблему для меня, я не знаю, почему мы не можем создавать параметры заголовка отдельно для повторного использования и т. Д. Встроенный, только если вы хотите настроить responseType

Michael Hudson 08.10.2019 06:04

Я только сегодня столкнулся с этой конкретной проблемой. После небольшого поиска и выяснения того, что параметр responseType должен существует, мне удалось заставить его работать, как показано ниже:

let requestOptions: Object = { 
    headers: new HttpHeaders().set('Authorization', 'Basic ' + credentials),
    responseType: 'text'
}    

return this.httpClient.get<any>(
                this.environment.tokenHost + this.environment.authenticationURL,
                requestOptions
            )
            .subscribe(result => {
                // do stuff
            });

Такая установка responseType заставляет его работать, по сравнению с настройкой в ​​самом «запросе».

С Уважением.

Вот подход, если вы не хотите удалять <string>, чтобы ваш ответ оставался строго типизированным:

    const httpOptions = {
      headers: new HttpHeaders({
        'Accept': 'text/plain, */*',
        'Content-Type': 'application/json' // We send JSON
      }),
      responseType: 'text' as 'json'  // We accept plain text as response.
    };
    return this.http.post<string>(this.setBaseUrl, body, httpOptions);

Замените text на допустимый responseType в соответствии с данными, которые вы хотите получать.

Я не понимаю, насколько удаление <string> является большим взломом, чем установка responseType на 'text' as 'json'. Есть ли между ними функциональная разница?

Flaom 16.03.2021 21:05

Не думаю, что должна быть функциональная разница. Единственная причина, по которой я бы назвал это лучшим подходом, - это машинописный текст, явное упоминание типа данных предпочтительнее; что здесь не нарушается.

atb00ker 20.03.2021 11:37

На самом деле удаление <string> не является взломом и не противоречит подходу машинописного текста. Фактически, реализация httpClient в Angular решает, что если вы используете текст resposneType: ', нет необходимости предоставлять общий тип, и, следовательно, этот перегруженный метод даже не принимает общий тип. Во всяком случае, указание машинописному тексту рассматривать "текст" как "json" определенно является уловкой.

Zabeeh Ullah Babar 10.05.2021 20:17
'text' as 'json' - это утверждение типа. Поскольку я ожидаю получить json, я просто говорю, что машинописный текст ведет себя так, как если бы результатом был JSON, введите в Google ключевое слово as. Всегда, когда это возможно, лучше сохранять строгую типизацию (пожалуйста, погуглите причины этого). Если вам не важен тип, используйте any (any по умолчанию; он слишком разрешающий, позволяет делать с переменной все что угодно; не рекомендуется, когда этого можно избежать - отсутствие типа делает его any). Я удалил слово hack, так как у меня нет времени отвечать на другие комментарии к нему. Ваше здоровье.
atb00ker 13.05.2021 16:41

Другие вопросы по теме