我一直在努力研究如何使用拦截器将我从服务器获得的XML响应转换为JSON格式。对于转换,我使用xml2json并且插件工作正常,所以没有问题。
但是,我的目标是通过拦截器更改响应体。到目前为止的代码如下:
服务:
getData(query) {
return new Promise( (resolve, reject) => {
this.http.get(this.SERVER_URL + query, {responseType: 'text'} ).subscribe(
(data) => {
resolve( JSON.parse(data) );
},
(err) => {
reject(err);
}
);
});
}
拦截器:
intercept( req: HttpRequest<any>, next: HttpHandler ): Observable<HttpEvent<any>> {
return next.handle(req)
.retry(3)
.map( (event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// xml2js transform
parseString(event.body, function(e, res) {
if (e != null) {
return (e);
}
event = (event as HttpResponse<any>).clone({
body: JSON.stringify(res)
});
return event;
});
}
return event;
})
.catch(err => {
return Observable.of(err);
});
}
代码正在运行,但我正在做的是一个缓慢的解决方法:拦截器正在执行parseString()
转换,然后JSON.stringify(res)
将结果字符串化。这个字符串最终到达http.get的成功处理程序,然后返回JSON.parse(data)
。
如果我没有对响应主体进行字符串化,则调用http的错误处理程序,因为我猜它是期望文本(字符串)而不是json。但是,如果我将http responseType设置为json,那么拦截器正在接收一个空对象event
..那么我怎样才能消除stringify / parse调用?
感谢每一位帮助,谢谢:)