从Fetch API

时间:2017-04-19 04:00:21

标签: javascript fetch-api

假设我的小函数将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参数传递的值。我似乎无法为网址提供一种方法。

1 个答案:

答案 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的特殊情况。