【问题标题】:angular 5 httpclient , on post , the response does not return headers, only returns response objectangular 5 httpclient ,在 post 上,响应不返回标头,只返回响应对象
【发布时间】:2018-11-20 02:28:13
【问题描述】:

我最近移到了 Angular 5 和更早的 http.post 返回响应对象的完整标头,但是使用 httpclient 时,它不返回响应标头。如何更改这部分帖子代码以提供完整的响应对象,包括响应标头

我阅读了有关使用 {observable: "response"} 的信息,但它不起作用

post(inURL,  data, config = undefined)  {
  let headers, options;
  if (config) {
    options = config;
  } else {
    //headers = this.getDefaultHeader();
    //options = new RequestOptions({ headers: headers });
    options = httpOptions;
  }

  let action = this.httpService.post(inURL,  data, options);
  return new Promise((resolve, reject) => {
    action.subscribe(
      response => resolve(response),
      error => {
        this.interceptError(error);
        reject(error);
      }
    );
  });    
}

【问题讨论】:

  • 这是{observe: ... },而不是{observable: ... }

标签: angular angular-httpclient


【解决方案1】:

我假设您有充分的理由从这里返回 promise 而不是 Observable。

话虽这么说,你在这里让事情复杂化了。您可以简单地在来自post 的返回值上调用toPromise()

好吧,你说你使用了{observable: "response"},但它没有用。那是因为你没有正确使用它。它应该是 {observe: "response"} {observable: "response"}

它必须是选项的一部分。所以我使用了扩展运算符(...)并将{observe: "response"} 添加到options

试试这个:

post(inURL,  data, config = undefined)  {
  let headers, options;
  if (config) {
    options = config;
  } else {
    //headers = this.getDefaultHeader();
    //options = new RequestOptions({ headers: headers });
    options = httpOptions;
  }

  options = { ...options, observe: 'response' };

  this.httpService.post(inURL, data, options)
    .toPromise();
}

【讨论】:

  • 除了代码之外,您在所有地方都重复了 OP 的错字。
  • @IngoBürk,我猜是复制粘贴。顺便说一句,我现在已经修好了 :)
  • @SiddAjmera 谢谢,这行得通,但是我正在尝试从帖子的响应中检索自定义令牌,但是有了这个,我仍然看不到标题对象具有我正在寻找的密钥' xxxtoken' 响应标头具有,但是返回的标头不提供对此 xxxtoken 密钥的访问权限
  • @looneytunes,您可能想检查 API 是否真的返回了这样的标头,可能在 Postman 中。
  • 是的,它确实返回,缓存控制:无缓存,无存储,必须重新验证内容安全策略:default-src 'self';font-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' data:;style-src 'self' 'unsafe-inline';frame-ancestors 'none' 内容类型: application/json;charset=UTF-8 xxxtoken:e33e8be9-cd14-4114-8bcf-adee60e8fc14 设置cookie:JSESSIONID=CED04E7652F8B31DBAFF7AB041330F33;路径=/view-vlsi;安全的; HttpOnly 状态:200 strict-transport-security: max-age=31536000
【解决方案2】:

您可以在进行 HTTP 调用后返回 HttpClient 响应:

getServiceData(): Observable<any>{
      return this.httpClient
        .post(myUrl, requestBodyObj)
        .map((httpResponse: any) => {
            if (httpResponse.operationStatus.statusCode === '0') {
                return httpResponse.data;
            } else {
                throw new Error('error in service call');
            }
        })

 }     

在你的组件类中你可以订阅服务方法:

myService.subscribe( (data) => {
      // do something with data received
    }, error => {
      // do something when error 
    })

更多HttpClient使用细节可以在官方指南seen here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多