【问题标题】:Cant see headers of http post [Angular4]看不到http帖子的标题[Angular4]
【发布时间】:2019-02-10 08:25:41
【问题描述】:

这应该很容易解决,但我知道我的想法无法找到解决方案。

我有一个这样的帖子:

getAccordo(filtro: Filter): Observable<Response>  {
    return this.http.post<Response>(`${this.ENDPOINT}/export`,
        filtro,
        {observe: 'response', responseType: 'blob' as 'json'}   
    )
        .catch(error => this.handleError(error));
}

这就是我使用它的地方:

  public getAccordo(event: any): any {debugger;
    event.preventDefault();
    this.accordiService.getAccordo(this.filter).subscribe(
      res => {debugger;
        const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
        const anchor = document.createElement('a');
        anchor.href = window.URL.createObjectURL(blob);
        anchor.download = Utils.extractHeaders(res);
        anchor.click();
      },
      error => {
        console.log(error);
      }
    );
  }

当我查看 chrome 控制台时,我可以看到标题中有一个 content-disposition: attachment; filename="esportazione_accordi_20180905.xlsx"

但在我的“res”中,这是缺失的。

id喜欢做的是获取文件名并在anchor.download中使用。

感谢您的帮助,如果您需要更多帮助,请随时询问。

编辑

这是我从响应标头中获得的标头,我什至没有看到其中 1 个:

我在服务器端添加了:.header("Access-Control-Expose-Headers", "content-disposition") 但还是不行

编辑2:

好的,我们越来越近了,我需要获取图片末尾的“文件名”值并将其分配给 anchor.download。

【问题讨论】:

  • 响应标头被延迟解析 - 您需要实际尝试使用res.headers.get('Content-Disposition') 获取标头才能看到结果。
  • 好的,所以如果我使用 res.headers.get('Content-Disposition') 我得到了一切,最后一步,我如何使用我需要的值?我会在一分钟内再次更新帖子以向您展示我的意思
  • 您可以为此使用正则表达式 - 这是一个非常基本的示例:const filename = /attachment; filename="(.+")/.exec(headerValue)[1];。这假设正则表达式将匹配 - 您可以在此处访问它的第二个数组元素之前检查 exec 调用 null 的返回值以确保此处安全。
  • Here 的另一个问题是关于文件名解析的问题。

标签: angular typescript http-post


【解决方案1】:

为了公开这个标头到你的Angular XHR,服务器需要设置Access-Control-Expose-Headers响应标头以允许专门访问Content-Disposition标头. docs 有更多关于这个主题的信息:

默认情况下,只公开 6 个简单的响应头:

  • 缓存控制
  • 内容-语言
  • 内容类型
  • 过期
  • 最后修改
  • 编译指示

如果您希望客户端能够访问其他标头,则必须使用 Access-Control-Expose-Headers 标头列出它们。

这意味着您的服务器需要设置以下标头:

Access-Control-Expose-Headers: Content-Disposition

在 Angular 中,使用 HttpClient,响应标头被延迟解析 - 要获取特定标头的值,您需要使用以下内容 get 标头: p>

res.headers.get('Content-Disposition');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多