关于 http 请求的几种方式
AJAX 具体来说,AJAX 包括以下几个步骤:
创建 XMLHttpRequest 实例
发出 HTTP 请求
接收服务器传回的数据
更新网页数据
起步 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 const MYTHOD = "GET" ;const URL = "https://api.github.com/search/repositories?q=javascript&sort=stars" ; let xhr = null ;if (window .XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP" ); } xhr.onreadystatechange = function ( ) { if (xhr.readyState === 4 && xhr.status === 200 ) { console .log(xhr.responseText); } }; xhr.onerror = err => console .error("Error: " , xhr.statusText); xhr.open(MYTHOD, URL, true ); xhr.send(null );
设置头信息 该方法必须在 open()之后、send()之前调用。如果该方法多次调用,设定同一个字段,则每一次调用的值会被合并成一个单一的值发送。
1 2 3 xhr.setRequestHeader("Content-Type" , "application/json" ); xhr.setRequestHeader("Content-Length" , JSON .stringify(data).length); xhr.send(JSON .stringify(data));
Ajax+Promise 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 let ajax = ({ method = "GET" , path, body, headers } ) => { return new Promise ((resolve, reject ) => { let request = new XMLHttpRequest(); request.open(method, path, true ); if (method == "GET" ) { request.send(null ); } else { for (const key in headers) { let value = headers[key]; request.setRequestHeader(key, value); } request.send(body); } request.onreadystatechange = () => { if (request.readyState === 4 ) { if (request.status >= 200 && request.status < 400 ) { resolve.call(undefined , request.responseText); } else if (request.status >= 400 ) { reject.call(undefined , request); } } }; }); }; ajax({ method: "get" , path: "https://api.github.com/search/repositories?q=javascript&sort=stars" , headers: { "content-type" : "application/json" } }).then( responseText => { console .log(responseText); }, request => { console .log(request); } );
jQuery 使用 get 方法,返回一个 deferred 对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 const URL = "https://api.github.com/search/repositories?q=javascript&sort=stars" ; let request = $.get(URL);request .done(function (data ) { console .log(data); }) .fail(function (err ) { console .log(err); }); let request = $.ajax({ url: URL, type: "GET" }); request.done(data => console .log(data)).fail(err => console .log(err));
使用 promise:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function getData ( ) { return new Promise ((resolve, reject ) => { $.ajax({ url: "https://api.github.com/search/repositories?q=javascript&sort=stars" , type: "GET" , success: function (data ) { resolve(data); }, error: function (err ) { resolve(err); } }); }); } getData() .then(function (data ) { console .log(data); }) .catch(function (err ) { console .log(err); });
Fetch 函数 Fetch 提供了 Request 和 Response 对象(以及与网络请求有关的其他内容)的一般定义。
Fetch API 提供了 fetch() 方法,它被定义在 BOM 的 window 对象中,你可以用它来发起对远程资源的请求。
fetch() 方法返回的是一个 Promise 对象,让你能够对请求的返回结果进行检索。
fetch 的配置:
Promise fetch(String url [, Object options])
;
Promise fetch(Request req [, Object options])
;
1 2 3 4 5 6 7 8 9 10 11 const URL = 'https://api.github.com/search/repositories?q=javascript&sort=stars' ;let req = new Request(URL, { method : "GET" , cache : "reload" });fetch(req) .then(function (response ) { return response.json(); }) .then(function (json ) { console .log(json); }).catch(function (err ) { console .log(err); }
fetch 和 ajax 的主要区别:
fetch()返回的 promise 将不会拒绝 http 的错误状态,即使响应是一个 HTTP 404 或者 500
在默认情况下 fetch 不会接受或者发送 cookies
Axios 基本使用:
1 2 3 4 5 6 const URL = "https://api.github.com/search/repositories?q=javascript&sort=stars" ; axios .get(URL) .then(response => console .log(response)) .catch(err => console .log(err));
或者使用 async/await
:
1 2 3 4 5 6 7 8 async function getData ( ) { try { return await axios.get(URL); } catch (error) { console .error(error); } } getData().then(data => console .log(data));
资料