我正在执行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
答案 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;
}
})
)
}