假设我的小函数将Request
对象作为参数,并调用fetch()
API。
除了我总是想在网址上附加内容,例如?foo=bar
。我很好奇最好的办法是什么。
示例:
function fetchFoo(request) {
request.url += '?foo=bar';
return fetch(request);
}
我遇到的问题是这不会起作用。 Fetch API specification表示url属性为只读。
有办法解决这个问题吗?我想我可能需要构建一个全新的Request
对象,但我不确定从前一个Request
对象继承所有选项的聪明方法。 / p>
请注意,我可以使用以下语法覆盖任何其他属性:
var originalRequest = new Request('/url');
var overriddenRequest = new Request(originalRequest, { method: 'POST' });
虽然从文档中无法清除,但似乎第二个init参数优先于通过originalRequest
参数传递的值。我似乎无法为网址提供一种方法。
答案 0 :(得分:2)
您可以利用Request.prototype
上的密钥在几行内构建新的Request
对象。
function newRequest(input, init) {
var url = input;
if (input instanceof Request) {
url = mutateUrl(input.url);
init = init || {};
Object.keys(Request.prototype).forEach(function (value) {
init[value] = input[value];
});
delete init.url;
return input.blob().then(function (blob) {
if (input.method.toUpperCase() !== 'HEAD' && input.method.toUpperCase() !== 'GET' && blob.size > 0) {
init.body = blob;
}
return new Request(url, init);
})
} else {
url = mutateUrl(url);
}
return new Request(url, init);
}
请注意this answer中讨论的body
的特殊情况。