#angular #typescript #http #rxjs
#angular #typescript #http #rxjs
Вопрос:
Всякий раз, когда я пытаюсь использовать {{RequestType: ‘text’}} в моем вызове http.get (url), я получаю сообщение об ошибке, которую я не могу определить, и разрешены только массивы и итерации; однако я беру свой объект и преобразую его в массив. Мне нужна некоторая помощь в понимании моей ошибки и в том, как исправить мою ситуацию
Когда я удаляю RequestType, массив проходит без проблем и отображается в моем интерфейсе.
----service-----
getAll(){
const requestOptions: Object = {
/* other options here */
responseType: 'text'
}
return this.http.get<any>(this.url, requestOptions);
}
---component .ts-----
notificationsFass: any[];
constructor(route: ActivatedRoute, private metaService: Meta, private notificationService: NotificationsFassService) {
this.notificationsFass = [];
}
ngOnInit() {
this.notificationService.getAll()
.subscribe(notificationsFass => {
this.notificationsFass = notificationsFass;
}
);
}
---html---
<div *ngFor="let m of notificationsFass">
---error----
ERROR Error: Error trying to diff '[{"incidentNumber":700,"createdByName":"FASS Notification","createdDate":"2019-03-27T09:18:15.000 0000"}]'. Only arrays and iterables are allowed
Комментарии:
1. Какой фактический тип содержимого отправляется с сервера? Если тип содержимого является
application/json
, не было бы причин использоватьresponseType: 'text'
. «Данные», отображаемые в ошибке, выглядят как JSON, поэтому вы можете просто использовать значение по умолчаниюresponseType
, чтобы HttpClient проанализировал полученный JSON для использования в вашем шаблоне. По какой причине вы хотите использоватьresponseType: 'text'
?2. однако я беру свой объект и преобразую его в массив. : где? Опубликованный код нигде этого не делает. Вы пытаетесь выполнить итерацию по строке.
3. Это application / json; однако я получаю ошибки HttpResponse с моего сервера, когда он не может отобразить JSON из того, что я прочитал, что если у меня будет текст HttpResponse, я могу избавиться от этих ошибок
4. Нет, вы берете свой текстовый ответ с сервера (строку) и перезаписываете пустой массив, который есть
notificationFass
.5.Правильно,
*ngFor
может отображать объекты только определенного формата, такие как массив объектов. Определенно не используйте,responseType: 'text'
если ваш тип содержимогоapplication/json
. Это не будет проанализировано и будет просто строкой, которая ни при каких обстоятельствах не может быть использована структурными директивами, такими как*ngFor
. Вероятно, вам следует поделиться логикой, по которой вы принимали ответ доtext
responseType
изменения и превращали его в массив.
Ответ №1:
На основе json в сообщении об ошибке вам нужно выполнить следующее:
- При определении интерфейса я использовал имя
INotification
. Это определит элементы, доступные в десериализованном ответе json. - Строго введите возвращаемые типы метода, а также укажите аргумент универсального типа в
http.get<T>
. Приhttp.get
вызове он попытается десериализовать ответ json с сервера в объектный граф. ОпределивINotification[]
в качестве возвращаемого типа дополнительные вызывающие устройства, например, из компонента, теперь могут безопасно вызывать элементы возвращаемого типа likefind
или другие элементы Array.prototype, а также получать доступ к определенным элементам в экземплярах массива.
responseType: 'text'
требуется только тогда, когда вы не отправляете ответ с сервера или когда ответ является текстовым, а не json. Первое может произойти с вызовами post
or put
или delete
, когда сервер может отправлять только статус и не содержать тела сообщения в ответе.
Вот ваш сервисный код, переписанный на основе приведенного выше отзыва.
notificationsFassService.ts
export interface INotification {
incidentNumber: number;
createdByName: string;
createdDate: string;
}
export class NotificationsFassService {
constructor (private readonly http: HttpClient) { }
getAll():Observable<INotification[]> {
return this.http.get<INotification[]>(this.url);
}
}
notificationsFassComponent.ts
export class NotificationsFassComponent implements OnInit {
notificationsFass: INotification[];
constructor(route: ActivatedRoute, private metaService: Meta, private notificationService: NotificationsFassService) {
this.notificationsFass = [];
}
ngOnInit() {
this.notificationService.getAll()
.subscribe(notificationsFass => {
this.notificationsFass = notificationsFass;
});
}
}