简体   繁体   English

如何更改响应的标题?

[英]How to alter the headers of a Response?

Is it possible to alter the headers of a Response object, as returned by fetch() ? 是否可以更改由fetch()返回的Response对象的标头?

Suppose I want to transform a response via resFn : 假设我想通过resFn转换响应:

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

What should resFn() look like? resFn()应该是什么样? One attempt: 一种尝试:

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

Fails with TypeError: Failed to execute 'set' on 'Headers': Headers are immutable . 出现TypeError: Failed to execute 'set' on 'Headers': Headers are immutable

(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?) (一个单独的问答解释了如何更改请求的标头 。鉴于RequestResponse对象出奇的不同(不同的属性及其构造函数采用不同的参数),是否适用相同的解决方案?)

This can be done by "manually" cloning the response: 这可以通过“手动”克隆响应来完成:

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

where the newResponse() helper function is: 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
      }));
    });
  });

}

Note that newResponse() returns a Promise<Response> . 请注意, newResponse()返回Promise<Response>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM