Angular 5 - http获取xml响应

时间:2018-03-07 16:07:07

标签: angular typescript http rxjs

Newby需要帮助解决错误。我通过http get请求请求数据。数据采用xml格式。我需要将它转换为json,以便在我的Angular应用程序中使用。当我运行以下代码时,我在控制台中出现错误" TypeError this.http.get()。map不是函数。

list() {
  return this.http.get(this.apiRoot).map(res => {
  let data;
  xml2js.parseString( res.toString, function (err, result) {
  console.dir(data); // Prints JSON object!
  data = result;       
  });
  return data;
  })
  .subscribe(data => { 
  console.log(data);              
  });  }

由于

2 个答案:

答案 0 :(得分:0)

您需要从rxjs导入observables的运算符映射。

import { map } from 'rxjs/operators';

答案 1 :(得分:0)

您需要导入rxjs地图运算符。使用现有代码,您可以:

import 'rxjs/add/operator/map';

您也可以导入操作员功能。这是首选。请参阅:https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md

import { map } from 'rxjs/operators';

...
  return this.http.get(this.apiRoot).pipe(map(res => {

如果您使用已弃用的HttpModule而不是HttpClient,则必须执行额外步骤才能获得回复文字:

.pipe(
  map(res => res.text()),

如果您使用的是HttpClient,则无需执行此操作。

最后,由于您使用的xml2js不支持Promises或Observable,因此您必须将调用包装到.parseString以将其添加到可观察流中。幸运的是,RxJS提供了一个包装函数,可以为您执行此操作:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindNodeCallback

我们在这里使用switcMap代替map,因为bindNodeCallback会返回一个observable。 switchMap会为我们压扁

import { bindNodeCallback } from 'rxjs/observable/bindNodeCallback';
import { switchMap } from 'rxjs/operators';

function list() {
  return this.http
    .get(this.apiRoot)
    .pipe(switchMap(res => bindNodeCallback(xml2js.parseString)(res)))
    .subscribe(console.log);
}