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