現代瀏覽器,最開始與服務器交換數據,都是經過XMLHttpRequest
對象。它可使用JSON、XML、HTML和text文本等格式發送和接收數據。javascript
if (window.XMLHttpRequest) { // model browser
xhr = new XMLHttpRequest()
} else if (window.ActiveXObject) { // IE 6 and older
xhr = new ActiveXObject('Microsoft.XMLHTTP')
}
xhr.open('POST', url, true)
xhr.send(data)
xhr.onreadystatechange = function () {
try {
// 處理響應
if (xhr.readyState === 4) {
// 請求正常
if (xhr.status === 200) {
// 處理響應
} else {
// 請求遇到一些問題,處理異常
}
} else {
// 還處於未準備好的狀態
}
} catch (e) {
// 通訊錯誤的事件中(例如服務器宕機)
alert('Caught Exception: ' + e.description)
}
}
複製代碼
優勢:前端
缺點:java
爲了更快捷的操做 DOM,而且規避一些瀏覽器兼容問題,產生了jQuery
。它裏面的AJAX
請求也兼容了各瀏覽器,能夠有簡單易用的方法$.get
,$.post
。簡單點說,就是對XMLHttpRequest
對象的封裝。node
$.ajax({
type: 'POST',
url: url,
data: data,
dataType: dataType,
success: function () {},
error: function () {}
})
複製代碼
優勢:jquery
XHR
的封裝,作了兼容處理,簡化了使用。JSONP
的支持,能夠簡單處理部分跨域。缺點:ios
Fetch
API提供了一個 JavaScript
接口,用於訪問和操做HTTP管道的部分,例如請求和響應。它還提供了一個全局 fetch()
方法,該方法提供了一種簡單,合理的方式來跨網絡異步獲取資源。git
fetch
是底層API,代替XHR
,能夠輕鬆處理各類格式,非文本化格式。能夠很容易的被其餘技術使用,例如Service Workers
。可是想要很好的使用fetch
,須要作一些封裝處理。github
fetch('http://example.com/movies.json')
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
複製代碼
優勢:跨域的處理ajax
在配置中,添加mode: 'no-cors'就能夠跨域了編程
fetch('/users.json', {
method: 'post',
mode: 'no-cors',
data: {}
}).then(function() { /* handle response */ });
複製代碼
缺點:
fetch
只對網絡請求報錯,對400
,500
都當作成功的請求,須要封裝去處理fetch
默認不會帶cookie
,須要添加配置項。fetch
不支持abort
,不支持超時控制,使用setTimeout
及Promise.reject
的實現超時控制並不能阻止請求過程繼續在後臺運行,形成了流量的浪費。fetch
沒有辦法原生監測請求的進度,而XHR
能夠。請注意,fetch
規範與jQuery.ajax()
主要有三點不一樣,牢記:
- 當接收到一個表明錯誤的 HTTP 狀態碼時,從
fetch()
返回的Promise
不會被標記爲reject
, 即便該 HTTP 響應的狀態碼是404
或500
。相反,它會將Promise
狀態標記爲resolve
(可是會將resolve
的返回值的ok
屬性設置爲false
),僅當網絡故障時或請求被阻止時,纔會標記爲reject
。fetch()
不會接受跨域cookies
;你也不能使用fetch()
創建起跨域會話。其餘網站的Set-Cookie
頭部字段將會被無視。fetch
不會發送cookies
。除非你使用了credentials
的 初始化選項。(自2017年8月25日之後,默認的credentials
策略變動爲same-origin
。Firefox也在61.0b13版本中,對默認值進行修改)
axios
是一個基於promise
的HTTP庫,能夠用在瀏覽器和 node.js
中。它本質也是對原生XMLHttpRequest
的封裝,只不過它是Promise
的實現版本,符合最新的ES規範。
這是官方的併發案例:
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(),getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// Both requests are now complete
}));
複製代碼
axios是尤雨溪大神推薦使用的,
優勢:
XMLHttpRequests
node.js
中使用Promise API
JSON
數據XSRF
缺點: