如何更改响应的标头? [英] How to alter the headers of a Response?

查看:63
本文介绍了如何更改响应的标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以更改 Response 对象,由 返回fetch() ?

Is it possible to alter the headers of a Response object, as returned by fetch()?

假设我想通过 resFn 转换响应:

Suppose I want to transform a response via resFn:

self.addEventListener('fetch', function (event) {
  event.respondWith(fetch(event.request).then(resFn));
});

resFn()应该是什么样?一次尝试:

What should resFn() look like? One attempt:

function resFn(res) {
  res = res.clone();
  res.headers.set("foo", "bar");
  return res;
}

失败,出现 TypeError:无法在标头"上执行设置":标头是不可变的.

(单独的问答解释了如何更改.鉴于 Request 代码> 和 响应 对象惊人地不同(不同的属性,其构造函数采用不同的参数),是否适用相同的解决方案?)

(A separate question and answer explain how to alter the headers of a request. Given that the the Request and Response objects are surprisingly dissimilar (different properties, and their constructors take different arguments), does the same solution apply?)

推荐答案

这可以通过手动"克隆响应来完成:

This can be done by "manually" cloning the response:

function resFn(res) {
  return newResponse(res, function (headers) {
    headers.set("foo", "bar");
    return headers;
  });
}

其中 newResponse()辅助函数是:

function newResponse(res, headerFn) {

  function cloneHeaders() {
    var headers = new Headers();
    for (var kv of res.headers.entries()) {
      headers.append(kv[0], kv[1]);
    }
    return headers;
  }

  var headers = headerFn ? headerFn(cloneHeaders()) : res.headers;

  return new Promise(function (resolve) {
    return res.blob().then(function (blob) {
      resolve(new Response(blob, {
        status: res.status,
        statusText: res.statusText,
        headers: headers
      }));
    });
  });

}

请注意, newResponse()返回 Promise< Response> .

这篇关于如何更改响应的标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆