使用fetch代替jQuery的ajax进行GET API调用

时间:2016-11-02 17:33:07

标签: javascript jquery ajax fetch

我最近发现自己转换了一个调用远程API的函数,从返回一个回调到返回Promise。我认为这也是一个很好的机会,可以通过$.ajax来电替换fetch来电,因为fetch已经返回Promise

但是,此特定调用是GET实际上需要有效负载(包含密钥和返回类型)。具体来说,我称之为:

$.ajax({
    type: 'GET',
    contentType: 'application/json; charset=utf-8',
    url: config.serviceUrl,
    data: {
        apiKey: key,
        format: 'json'
    }
})
.done(data => {...})
.fail((jqXHR, textStatus, errorThrown) => {...});

但是,fetch没有data属性,如果您尝试使用body请求发送GET,则会引发错误( { {1}} )。根据{{​​3}},这是预期的行为。

请记住:我完全无法控制外部API,因此提及发送带有TypeError: Failed to execute 'fetch': Request with GET/HEAD method cannot have body的有效负载违反了某些API协议,或者建议我更改基础调用,这样做无济于事。

在这种情况下是否可以使用GET?怎么样?

2 个答案:

答案 0 :(得分:4)

   var headers = new Headers();
   headers.append("Content-Type", "application/json; charset=utf-8");
   fetch(config.serviceUrl + "?apiKey=" + key + "&format=json", 
     {headers:headers, method:"GET"}
   ).then(response => response.json())
   .then(json => /* do stuff with `json` */)
   .catch(err => console.error(err));

相当于当前的$.ajax()来电。

答案 1 :(得分:3)

jQuery的ajax功能只需data附加到网址作为GET请求的网址参数

  

数据

     

要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它已附加到GET请求的URL。

Source

使用fetch,您可以手动执行,也可以使用类似的方法:

var url = new URL("http://youapi.com")
var data = {
    apiKey: key,
    format: 'json'
}

Object.keys(data).forEach(key => url.searchParams.append(key, data[key]))
fetch(url)