【问题标题】:angular 4 httpclient xml response角度 4 httpclient xml 响应
【发布时间】:2017-07-24 08:57:06
【问题描述】:
const headers = new HttpHeaders({ 'Content-Type': 'text/xml' });
headers.append('Accept', 'text/xml');
headers.append('Content-Type', 'text/xml');
this.http.get('getxmlurl', {headers: headers}).subscribe(response => {
  return '1234';
});

您好,我正在使用 Angular 4 httpclient 从一个返回 XML 响应的 spring 控制器发出一个 http get 请求。

我遇到的问题是响应始终为 NULL,即使我可以从 chrome 开发人员网络选项卡中看到 xml 响应。

我认为这可能与请求标头有关,角度 4 默认为 json 但是我无法使用上面的代码更改请求标头。有人可以请教。

谢谢

【问题讨论】:

  • 你没有对响应做任何事情?
  • 我已经弄清楚了。需要将 responseType 设置为文本。干杯 this.http.get(sldUrl, {observe: 'response', responseType: 'text', headers: headers})

标签: angular xml httpclient


【解决方案1】:

responseType 设置为text

this.http.get('getXmlUrl', { responseType: 'text' }).subscribe(response => {
  console.log(response);
});

responseType 的允许值:

  • arraybuffer
  • blob
  • json(默认)
  • text

responseType 值决定了一个成功的响应体将如何 被解析。

查看 Angular 文档:
HttpRequest # responseType
HttpClient # request()

【讨论】:

  • 对于 Observable 也可能需要设置 observable: 'body' ... this.myHttpCliVar.get('pathToMyTargetUrl' , { observe: 'body', responseType: 'text '} ).subscribe(valAsStr => {this.localStrVar = valAsStr; });请注意,它是 .get(...) 而不是 get(...)
  • 在 Angular 8 上不要忘记转换为对象 <Object>{ responseType: 'text' }
  • "如果responseType 是默认的json,您可以将结果对象的类型接口作为类型参数传递给调用。"。参见Overload #3 of the get() method in docsresponseType: 'text'的返回值为Observable<string>
【解决方案2】:

2019 Angular 7 以上 HttpClient Note with Code

TextXml 形式获取 Angular 响应 不是 Json 形式

在编写其他之前的答案之后,Angular 7 中可能发生了一些细微的变化。这就像对 MA-Maddin 的答案的代码的详细注释。

@Injectable()
export class MyWidgetService 

   private myHttpClient: HttpClient;

   constructor(httpClient: HttpClient) {
      super(httpClient); // you MIGHT need this 

      this.myHttpClient = httpClient; 
      }


   getResAsObservableStr = () => { 

      // Override the JSON Default Behavior.
      // 3 special things for text from HttpClient 
      //    a: Calling the raw .get('url')  NOT get<string>('url') 
      //    b: override observe: 'body' 
      //    c: override responseType: 'text' 

      return this.myHttpClient.get('pathUrlForCall' 
                 , { observe: 'body', responseType: 'text'} );
   }


// In Calling Coponent 
export class MyWidgetComponent 
   valAsStr: string;  

  constructor(
    // more vars like Router...
    private myWidgetSvcRef: MyWidgetService) { }

  ngOnInit() {

    this.getMyStrValFromWeb();

  } // ngOnInit end

  getMyStrValFromWeb = () => {

    this.myWidgetSvcRef.getResAsObservableStr()
    .subscribe(valAsStr => {this.valAsStr = valAsStr; });  

  } // end getMyStrValFromWeb


// in your html template (one possible scenario)

    <someControl [(ngModel)]="valAsStr" > </someControl>

【讨论】:

  • 感谢您的回答。传递 { observe: 'body', responseType: 'text'} 作为选项可以达到目的。它对我有用
【解决方案3】:

这里的问题是 HttpHeaders 在角度上是不可变的。因此,您应该在创建对象时进行设置,而不是设置值。类似的东西

const headers = new HttpHeaders({ 'Content-Type': 'text/xml' }).set('Accept', 'text/xml');

但您只设置请求标头。如果您希望您的响应是 text/xml。

this.http.get('getxmlurl', { headers: headers, responseType: text/xml }).subscribe(response => { return response; });

除非您想设置请求标头,否则您可以删除标头。

【讨论】:

  • responseType: text NOT text/xml
猜你喜欢
  • 2018-03-07
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2017-11-15
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多