angular HttpModule如何处理来自远程API的不适当的接收数据

时间:2018-04-13 21:24:22

标签: javascript angular typescript

我通过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"

由于两个错误,应用可能会被关闭:

  1. 收到的数据不再是有效的json格式。

  2. 因为它不是数组,所以会引起ng。

  3. 如何解决这个问题?

1 个答案:

答案 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捕获。