Angular JSON错误中的HttpClient请求

时间:2018-07-12 19:28:05

标签: json angular http newrelic

我正在执行http客户请求

export class MapjsonService{
  theUrl = 'http://localhost:4200/api/Lat_Long.json';
  constructor(private http: HttpClient) { }

  fetchNews(): Observable<any>{
    return this.http.get(this.theUrl)
  }

它大约99.99%的时间都在运行,可惜它经常运行,以至于每10分钟出现一次失败,

HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "http://localhost:4200/api/Lat_Long.json", ok: false, …}

"Http failure during parsing for http://localhost:4200/api/Lat_Long.json"

现在,由于某种原因,我从newrelic中找出了我的nrql查询(这是存储在'/api/lat_long.json'中的内容,每个橙月一次都没有最后的结束符'}'。这就是抛出此错误,我的问题是我有什么办法检查返回的值是否为有效的json,如果不是,请再次尝试GET请求,而不会终止调用它的进程。Thx

1 个答案:

答案 0 :(得分:2)

您的代码抛出错误是因为json不正确,因此无法对其进行解析,因此可观察对象将引发错误:

fetchNews(): Observable<any>{
  return this.http.get(this.theUrl)
}

默认情况下,http客户端期望json,因为这通常是用户期望的。并非总是如此,就像您现在所处的情况一样。

通过使用{responseType: 'text'}参数指定我们想要的内容,我们可以告诉http客户端不要自行解析json。

fetchNews(): Observable<any>{
  return this.http.get(this.theUrl, {responseType: 'text'})
}

但是随后您需要在可能的情况下解析json。因此,我们将映射可观察对象并在可能的情况下在此处解析内容。

fetchNews(): Observable<any>{
  return this.http.get(this.theUrl, {responseType: 'text'}).map(res => {
    try{ 
      return JSON.parse(res); 
    } catch {
      return null;
    }
  })
}

然后做任何您想做的事情,如果无法解析,则可观察对象返回的值将为null


RXJS 6语法:

fetchNews(): Observable<any>{
  return this.http.get(this.theUrl, {responseType: 'text'}).pipe(
    map(res => {
      try{ 
        return JSON.parse(res); 
      } catch {
        return null;
      }
    })
  )
}