一句話總結:Fetch是XMLHttpRequest一個更先進的替代方案(A Modern Replacement for XMLHttpRequest)。 fetch是全局變量window的一個方法,用來發起網絡請求、獲取資源,是傳統基於XMLHttpRequest對象的AJAX技術的更優替代方案。 fetch暫時不支持abort request。git
先看一個最簡單的get用法示例:github
// url (required), options (optional)
fetch('https://davidwalsh.name/some/url', {
method: 'get'
}).then(function(response) {
}).catch(function(err) {
// Error :(
});
複製代碼
下面是一個稍微複雜的post用法示例:json
fetch(url, {
method: "POST",
body: JSON.stringify(data),
headers: {
"Content-Type": "application/json"
},
credentials: "same-origin"
}).then(function(response) {
response.status //=> number 100-599
response.statusText //=> String
response.headers //=> Headers
response.url //=> String
return response.text()
}, function(error) {
error.message //=> String
})
複製代碼
fetch使用Promises來處理response。fetch接收兩個參數:跨域
還能夠使用Request對象實例做爲參數的方式發起fetch請求:promise
var request = new Request(url, options);
fetch(request).then(function(response) {
// handle with response...
}).catch(function(err) {
// Error :(
});
複製代碼
options能夠配置如下參數:瀏覽器
1.method (String) - HTTP 請求方法,默認:"GET" 2.body (String, body types) - HTTP 請求主體,示例:bash
{
body: new URLSearchParams([['foo', 1], ['bar', 2]]).toString()
}
複製代碼
body的類型包括:服務器
Class | Default Content-Type |
---|---|
String | text/plain;charset=UTF-8 |
URLSearchParams | application/x-www-form-urlencoded;charset=UTF-8 |
FormData | multipart/form-data |
Blob | inherited from the blob.type property |
ArrayBuffer | |
TypedArray | |
DataView |
其餘數據結構須要預先編碼爲上述類型之一。例如,JSON.stringify(data)可用於將數據結構序列化爲JSON字符串。cookie
3.headers (Object, Headers) - 請求頭,默認:{},示例:網絡
{
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式爲表單提交
})
}
複製代碼
headers提供如下方法增刪改查頭部信息:
4.credentials (String) - 跨域請求時方身份驗證憑證模式,默認:"omit" "omit" - 請求中不攜帶身份驗證憑證(例如cookies) "same-origin" - 在對同一站點的請求中包含身份驗證憑證 "include" - 在全部站點的請求中包含身份驗證憑證
Response表示來自服務器的HTTP響應。Response會做爲promise回調函數的參數。 包含如下屬性:
此外,response還提供了一些方法處理成特定的數據格式並返回一個Promise:
示例:
response.blob().then(function(myBlob) {
// do something with myBlob
});
複製代碼
若是出現網絡錯誤或其餘緣由致使HTTP請求沒法完成,fetch()的promise 將會reject該error。 注意,在HTTP 4xx或5xx服務器響應的狀況下,promise不會reject。這個promise將像HTTP 2xx同樣正常resolve。能夠經過檢查response.status的狀態碼來決定如何處理錯誤:
fetch(...).then(function(response) {
if (response.ok) {
return response
} else {
var error = new Error(response.statusText)
error.response = response
throw error
}
})
複製代碼
截至目前,fetch的瀏覽器兼容狀況以下圖所示: (能夠在can I use這個網站查詢瀏覽器兼容性)
若是想要兼容IE及老版本瀏覽器,能夠使用polyfill:whatwg-fetch