我正在编写一个包装器fetch
,我想在发出请求之前向 URL 添加一些内容,例如识别查询参数。我不知道如何使用Request
与原始 URL 不同的 URL 来制作给定对象的副本。我的代码如下所示:
// My function which tries to modify the URL of the request
function addLangParameter(request) {
const newUrl = request.url + "?lang=" + lang;
return new Request(newUrl, /* not sure what to put here */);
}
// My fetch wrapper
function myFetch(input, init) {
// Normalize the input into a Request object
return Promise.resolve(new Request(input, init))
// Call my modifier function
.then(addLangParameter)
// Make the actual request
.then(request => fetch(request));
}
我尝试将原始请求作为Request
构造函数的第二个参数,如下所示:
function addLangParameter(request) {
const newUrl = request.url + "?lang=" + lang;
return new Request(newUrl, request);
}
这似乎复制了旧请求的大部分属性,但似乎没有保留旧请求的属性body
。例如,
const request1 = new Request("/", { method: "POST", body: "test" });
const request2 = new Request("/new", request1);
request2.text().then(body => console.log(body));
我希望记录“测试”,但它记录的是空字符串,因为正文没有被复制。
我是否需要做一些更明确的事情来正确复制所有属性,或者是否有一个不错的快捷方式可以为我做一些合理的事情?
我正在使用github/fetch polyfill,但已经在最新的 Chrome 中测试了 polyfill 和本机fetch
实现。