Js中fetch方法
fetch()
方法定義在Window
對象以及WorkerGlobalScope
對象上,用於發起獲取資源的請求,其返回一個Promise
對象,這個Promise
對象會在請求響應后被resolve
,並傳回Response
對象。
描述
Promise<Response> fetch(input[, init])
input
: 定義要獲取的資源,其值可以是:
- 一個字符串,包含要獲取資源的
URL
,一些瀏覽器會接受blob
和data
作為schemes
。 - 一個
Request
對象。
init
: 一個配置項對象,包括所有對請求的設置。可選的參數有:
method
: 請求使用的方法,如GET
、POST
。headers
: 請求的頭信息,形式為Headers
的對象或包含ByteString
值的對象字面量。body
: 請求的body
信息:可能是一個Blob
、BufferSource
、FormData
、URLSearchParams
或者USVString
對象,注意GET
或HEAD
方法的請求不能包含body
信息。mode
: 請求的模式,如cors
、no-cors
或者same-origin
。credentials
: 請求的credentials
,如omit
、same-origin
或者include
,為了在當前域名內自動發送cookie
,必須提供這個選項。cache
: 請求的cache
模式:default
、no-store
、reload
、no-cache
、force-cache
或者only-if-cached
。redirect
: 可用的redirect
模式:follow
自動重定向,error
如果產生重定向將自動終止並且拋出一個錯誤,或者manual
手動處理重定向。referrer
: 一個USVString
可以是no-referrer
、client
或一個URL
,默認是client
。referrerPolicy
: 指定了HTTP
頭部referer
字段的值,可能為以下值之一:no-referrer
、no-referrer-when-downgrade
、origin
、origin-when-cross-origin
、unsafe-url
。integrity
: 包括請求的subresource integrity
值,例如:sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=
。
返回一個Promise
,resolve
時回傳Response
對象。
fetch與jQuery.ajax區別
- 當接收到一個代表錯誤的
HTTP
狀態碼時,從fetch()
返回的Promise
不會被標記為reject
, 即使響應的HTTP
狀態碼是404
或500
,其會將Promise
狀態標記為resolve
,但是返回的Promise
會將resolve
的返回值的ok
屬性設置為false
,僅當網絡故障時或請求被阻止時,才會標記為reject
。 fetch()
不會接受跨域cookies
,你也不能使用fetch()
建立起跨域會話,其他域的Set-Cookie
頭部字段將會被無視。fetch()
不會發送cookies
,除非使用了credentials
的初始化選項。
實例
發起請求
發起一個簡單的資源請求,對於fetch
請求返回一個Promise
對象,這個Promise
對象會在請求響應后被resolve
,並傳回Response
對象。
window.fetch("https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js")
.then(res => console.log(res))
設置參數
通過init
配置對象設置參數,可以設置method
、headers
、body
、mode
、credentials
、cache
、redirect
、referrer
、referrerPolicy
、integrity
。
var headers = new Headers({
"accept": "application/javascript"
});
headers.append("accept", "application/xml");
headers.set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36");
window.fetch("https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js", {
method: "GET",
headers: headers,
cache: 'no-cache',
})
.then(res => console.log(res))
Headers對象
Headers.append()
: 給現有的header
添加一個值, 或者添加一個未存在的header
並賦值。Headers.delete()
: 從Headers
對象中刪除指定header
。Headers.entries()
: 以迭代器的形式返回Headers
對象中所有的鍵值對。Headers.get()
: 以ByteString
的形式從Headers
對象中返回指定header的全部值。Headers.has()
: 以布爾值的形式從Headers
對象中返回是否存在指定的header
。Headers.keys()
: 以迭代器的形式返回Headers
對象中所有存在的header
名。Headers.set()
: 替換現有的header
的值, 或者添加一個未存在的header
並賦值。Headers.values()
: 以迭代器的形式返回Headers
對象中所有存在的header
的值。
響應處理
通過Response
對象對響應的數據作處理,包括獲取響應狀態以及響應體的處理等操作。
window.fetch("https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js")
.then(res => res.text())
.then(data => console.log(data))
Response對象
Response
對象的相關屬性與方法:
Response.headers
: 只讀,包含此Response
所關聯的Headers
對象。Response.ok
: 只讀,包含了一個布爾值,標示該Response
成功,HTTP
狀態碼的范圍在200-299
。Response.redirected
: 只讀,表示該Response
是否來自一個重定向,如果是的話,它的URL
列表將會有多個條目。Response.status
: 只讀,包含Response
的狀態碼。Response.statusText
: 只讀,包含了與該Response
狀態碼一致的狀態信息。Response.type
: 只讀,包含Response
的類型,例如basic
、cors
。Response.url
: 只讀,包含Response
的URL
。Response.useFinalURL
: 包含了一個布爾值,來標示這是否是該Response
的最終URL
。Response.clone()
: 創建一個Response
對象的克隆。Response.error()
: 返回一個綁定了網絡錯誤的新的Response
對象。Response.redirect()
: 用另一個URL
創建一個新的Response
。
Response
實現了Body
接口,相關屬性與方法可以直接使用:
Body.body
: 只讀,一個簡單的getter
,用於暴露一個ReadableStream
類型的body
內容。Body.bodyUsed
: 只讀,包含了一個布爾值來標示該Response
是否讀取過Body
。Body.arrayBuffer()
: 讀取Response
對象並且將它設置為已讀,並返回一個被解析為ArrayBuffer
格式的Promise
對象,Responses
對象被設置為了stream
的方式,所以它們只能被讀取一次。Body.blob()
:
讀取Response
對象並且將它設置為已讀,並返回一個被解析為Blob
格式的Promise
對象。Body.formData()
:
讀取Response
對象並且將它設置為已讀,並返回一個被解析為FormData
格式的Promise
對象。Body.json()
:
讀取Response
對象並且將它設置為已讀,並返回一個被解析為JSON
格式的Promise
對象。Body.text()
:
讀取Response
對象並且將它設置為已讀,並返回一個被解析為USVString
格式的Promise
對象。
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://segmentfault.com/a/1190000012740215
https://developer.mozilla.org/zh-CN/docs/Web/API/Headers
https://developer.mozilla.org/zh-CN/docs/Web/API/Response
https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API
https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch
https://developer.mozilla.org/zh-CN/docs/Web/API/WindowOrWorkerGlobalScope/fetch