Angular 5 - http get with xml response



>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);              
  });  }

谢谢

您需要从 rxjs 导入可观察量的操作员映射。

import { map } from 'rxjs/operators';

您需要导入 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,因此您必须包装对.parseString的调用才能将其添加到可观察量流中。幸运的是,RxJS提供了一个包装器函数,可以为您执行此操作:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindNodeCallback。

这里我们使用switcMap而不是map因为bindNodeCallback返回一个可观察量。 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);
}

最新更新