function success(text) { console.log('Success:' + text); } function fail(code) { console.error('Error Code: ' + code); } // 新建XMLHttpRequest对象 var request = new XMLHttpRequest(); // 状态发生改变时,执行回调函数 request.onreadystatechange = function() { // 判断请求是否完成 if(request.readyState === 4) { // 判断响应结果 if(request.status === 200) { // 请求成功,返回响应数据 return success(request.responseText); } else { // 请求失败,返回状态码 return fail(request.status) } } else { // Http请求还在继续中... } } // 发送Http请求 request.open('GET', '/api/test'); request.send(); alert('请求已发送,请等待响应...')
要点:html
- 常看浏览器是否支持XMLHttpRequest:
window. XMLHttpRequest;
- 建立XMLHttpRequest对象:
var request = new XMLHttpRequest();
XMLHttpRequest对象的经常使用属性:ajax
- onreadystatechange(请求状态是否改变)
- readyState(请求状态码,4表示请求已完成)
- status(响应状态码,200表示正确响应)
- responseText(具体响应内容)
XMLHttpRequest对象的经常使用方法:json
open()(该方法有三个参数)api
- 参数1:指定请求方法(GET / POST / HEAD)
- 参数2:指定URL(注意:该URL是相对路径)
- 参数3:指定是否异步(true / false),默认为true
send()(真正发送请求,该方法有一个参数)数组
- 若建立的POST请求,须要传递参数body
- 若建立的GET请求,能够省略该参数,或传null
// 只须要把XMLHTTPRequest()改成ActiveXObject('Microsoft.XMLHTTP')便可; var request = new ActiveXObject('Microsoft.XMLHTTP');
由于ActiveXObject对象的属性和方法和XMLHTTPRequest对象是同样的:promise
// 所以能够整合标准写法和低版本IE上的写法 var request; if(window.XMLHTTPRequest) { request = new XMLHTTPRequest(); } else { request = new ActiveXObject('Microsoft.XMLHTTP') }
var xhr= $.ajax('/api/test',{ dataType: 'json' }); // 不须要open() send(), 请求在建立完后即执行 // jQuery建立的xhr对象相似于一个Promise对象 xhr.done((data) => { console.log('Success: ' + JSON.stringify(data)); }).fail((xhr, status) => { console.error('Error: ' + xhr.status + ', Reason: ' + status); }).always(() => { console.log('请求完成: 不管成功或失败都会调用'); });
要点:浏览器
$.ajax()方法包含两个参数app
- 参数1:请求URL;
- 参数2:一个可选的setting对象;
setting配置异步
- async:是否为异步请求,缺省为true;
- method:http请求方法,缺省为'GET',还可设为'POST','PUT';
- headers:额外的http请求头,需为object对象;
- data:发送的数据,能够为字符串、数组或对象;
- contentType:发送POST请求的格式,缺省为'application/x-www-form-urlencoded',也可设为'text/plain'、'application/json'等;
- dataType:接受数据的格式,能够为'html'、'json'、'text'等,缺省值根据contentType自动断定;
jQuery ajax语法糖:async
$.get():发送一个get请求,第二个参数能够为一个object,jq会自动拼接为string
$.get('api/test',{ name: 'huang xin', age: 18 }) // 等价于 /api/test?name=huang%xin&age=18$.post():发送一个post请求,第二个参数缺省被序列化application/x-www-form-urlencoded
$.post('api/test',{ name: 'huang xin', age: 18 }) // 以 name=huang%xin&age=18 做为body发送post请求- $.getJSON():发送一个get请求,并返回一个JSON对象;
// ajax将返回promise对象 function ajax(method, url, data) { let request = new XMLHttpRequest(); return new Promise((resolve,reject) => { request.onreadystatechange = () => { if(request.readyState === 4) { if(request.status === 200) { resolve(request.responseText); } else { reject(request.status); } } } request.open(method,url); request.send(data); }); } var p = ajax('GET','/api/test'); p.then((text) => { // ajax成功,得到响应内容; console.log('Success: ' + text); }).catch((code) => { // ajax失败,得到状态码; console.error('Error Code: ' + code); })
练习:使用XHR模拟$.ajax的实现
var options = { url: 'test.me', // 请求地址 type: 'GET', // 请求方式 data: {name:'hx', age:18}, // 请求参数 dataType: 'json', // 数据返回格式 success: function(text,xml) { // 请求成功回调 // 请求成功后的业务逻辑 }, fail: function(status) { // 请求失败回调 // 请求失败后的业务逻辑 } } function ajax(options) { // 各step的代码 } // ajax(options); 实际调用
function createXHR() { var xhr; if(window.XMLHTTPRequest) { xhr = new XMLHTTPRequest(); } else { xhr = new ActiveXObject('Microsoft.XMLHTTP') } return xhr; }()
if(options.type == 'GET') { xhr.open('GET',buildGetUrl(options.url,options.data)); xhr.send(); } else if(options.type == 'POST') { xhr.open('POST',options.url); xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded') xhr.send(options.data) } else { // 其余请求方法,如: // xhr.open('HEAD',options.url); // ... }
xhr.onreadystatechange = function() { if(xhr.readyState === 4) { if(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { options.success(xhr.responseText,xhr.responseXML); } else { options.fail(xhr.status) } } }
buildGetUrl(url,params) { for(let item in params) { url += (url.includes('?') ? '&':'?'); url += encodeURIComponent(item) + '=' + encodeURIComponent(params[item]); } return url; }