我最近发现自己转换了一个调用远程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
?怎么样?
答案 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。
使用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)