我通过Angular从远程API获取数据,如下所示:
this.http.get("https://example.com/getUsers").subscribe(users => {
this.users = users.json();
});
在HTML组件中:
<ul>
<li *ngFor="let x of users; let i = index">
{{x.id}} {{x.body}}
</li>
</ul>
现在,当数据按照应有的结构 - json编码文档数组时,每件事情都可以。
但是如果远程数据结构将改变:
[
{
// some object
}
]
到
"just a string"
由于两个错误,应用可能会被关闭:
收到的数据不再是有效的json格式。
因为它不是数组,所以会引起ng。
如何解决这个问题?
答案 0 :(得分:1)
在订阅中,您正在捕获onNext,但您也需要捕获onError:
this.http.get("https://example.com/getUsers").subscribe(
users => {
this.users = users.json();
},
error => {
console.log(error);
this.users = [];
}
);
Here您有关于订阅的详细信息。
顺便提一下,如果你的问题是,那个响应是在onNext中捕获的,问题是&#39;用户&#39;不是数组,您可以在之前检查:
this.http.get("https://example.com/getUsers").subscribe(
users => {
// Check if users is an array, but you may check whatever you need.
if (Array.isArray(users)) {
this.users = users.json();
} else {
this.users = [];
}
},
error => {
console.log(error);
this.users = [];
}
);
您需要知道两个http标头,首先,有一个名为"Accept"
的htpp请求标头,此标头指定您将接受的mimetype,例如,如果您设置了请求标头{{在执行http get之前,当后端接受请求并且&#34;完成了他的工作&#34;时,它将设置一个名为"Accept: application/json"
的http响应头,此头指定响应的mimetype身体。如果"Content-Type"
请求标头与"Accept"
响应标头不同,则会被OnError捕获。
可能你没有指定"Content-Type"
标题,所以无论mimetype有什么响应体,它都会被onNext捕获。