首页 > 解决方案 > 角度,如何通过拦截器将 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 调用呢?

感谢您的每一个帮助,谢谢:)

标签: angularinterceptor

解决方案


推荐阅读