JavaScript 中的 HTTP GET 请求?
2022-08-29 22:10:13
我需要在JavaScript中做一个HTTP GET请求。最好的方法是什么?
我需要在Mac OS X仪表板小部件中执行此操作。
我需要在JavaScript中做一个HTTP GET请求。最好的方法是什么?
我需要在Mac OS X仪表板小部件中执行此操作。
浏览器(和 Dashcode)提供了一个 XMLHttpRequest 对象,可用于从 JavaScript 发出 HTTP 请求:
function httpGet(theUrl)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
xmlHttp.send( null );
return xmlHttp.responseText;
}
但是,不鼓励使用同步请求,它将生成如下警告:
注意:从 Gecko 30.0(Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27)开始,由于对用户体验的负面影响,主线程上的同步请求已被弃用。
您应该发出异步请求并在事件处理程序中处理响应。
function httpGetAsync(theUrl, callback)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
callback(xmlHttp.responseText);
}
xmlHttp.open("GET", theUrl, true); // true for asynchronous
xmlHttp.send(null);
}
新的 window.fetch
API 是一个更干净的替代品,它利用了 ES6 的承诺。这里有一个很好的解释,但它归结为(来自文章):XMLHttpRequest
fetch(url).then(function(response) {
return response.json();
}).then(function(data) {
console.log(data);
}).catch(function() {
console.log("Booo");
});
浏览器支持现在在最新版本中很好(适用于Chrome,Firefox,Edge(v14),Safari(v10.1),Opera,Safari iOS(v10.3),Android浏览器和Chrome for Android),但是IE可能不会获得官方支持。GitHub有一个polyfill可用,建议支持仍在使用的旧版浏览器(特别是2017年3月之前的Safari版本和同期的移动浏览器)。
我想这是否比jQuery或XMLHttpRequest更方便取决于项目的性质。
这是规范 https://fetch.spec.whatwg.org/
编辑:
使用 ES7 async/await,这变得很简单(基于以下要点):
async function fetchAsync (url) {
let response = await fetch(url);
let data = await response.json();
return data;
}