angular - 角度,如何通过拦截器将 XML 响应转换为 JSON
问题描述
我一直在努力解决如何使用拦截器将我从服务器获得的 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 调用呢?
感谢您的每一个帮助,谢谢:)
解决方案
推荐阅读
- r - 使用 dplyr 到 group_by 并仅使用 if(没有 else)语句有条件地变异
- python - TypeError:参数 1 必须是 pygame.Surface,而不是我的 Python 游戏中的 pygame.Rect
- javascript - 多个文件流而不是下载到磁盘然后压缩?
- .net - 如何通过 .NET 在 BIM 360 上创建文件夹
- angular - Angular 7 + ag-Grid 在控制台中显示不正确的警告
- highcharts - 在highchart中,给出不相等的tickPositions后如何保持网格线位置相等?
- git - 如何放弃旧的 Git Master,并使用分支作为新的 master?
- java - 从 3 字节数组创建位图图像
- c# - C# SSIS 中的 JSON 序列化
- python-3.x - 在单个 Try: 块中处理多个但相同类型的异常 - NoSuchElementException