前端最基礎的就是 HTML+CSS+Javascript
。掌握了這三門技術就算入門,但也僅僅是入門,如今前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS
),本着提高技術水平,打牢基礎知識的中心思想,咱們開課啦(每週四)。html
fetch
用於獲取資源(包括跨域請求),其實和 XMLHttpRequest
差很少。那麼爲何 AJAX 的解決方案已經有了,咱們還要搞出一個新的API?前端
其實這是符合規則的。不是說 XMLHttpRequest
很差。而是科技發展就是這樣,過個幾年就要來點顛覆性的更新。ajax
XMLHttpRequest
後面都叫 XHR
吧。json
默認不帶 Cookie
,這是一大槽點,我才接觸的時候就常常吐槽(可是如今已經改了)。segmentfault
自從2017年8月25往後,默認的credentials
政策變動爲same-originFirefox
也在61.0b13
中改變默認值
使用 Fetch - mdn
請求不能中途終止(XHR
有abort()
)跨域
瀏覽器已經開始爲AbortController
和AbortSignal
接口(也就是Abort API)添加實驗性支持,容許像 Fetch 和 XHR 這樣的操做在還未完成時被停止
Fetch API - mdn
fetch(input [, init]);
瀏覽器
Request
對象。在 sw 中 fetch 事件捕獲到的就是 Request 對象。這是一個對象。緩存
method
請求方式微信
get
、post
、put
等headers
請求頭cookie
Headers
對象body
消息體,支持的和 XHR 同樣。get 須要本身拼接在URL上
content-type: multipart/form-data
content-type: application/x-www-form-urlencoded
mode
字符串類型
cors
跨域請求no-cors
正常的網絡請求(默認) same-origin
只請求同域credentials
cookie攜帶的方式
字符串類型
omit
不攜帶 cookie (早期默認值,後來改了) same-origin
同域請求攜帶 cookie (默認值) include
一直攜帶 cookie。不考慮同域跨域cache
緩存模式
default
、no-store
、reload
、no-cache
、force-cache
、only-if-cached
redirect
重定向處理方式
字符串類型
follow
自動處理,跟隨跳轉(早期默認值,後來改了)manual
阻止、(默認值) error
禁止處理referrer
請求來源
字符串類型 url地址,不可跨域。能夠是相對路徑
client
標識客戶端本身處理。默認 no-referrer
不傳遞referrerPolicy
no-referrer
、no-referrer-when-downgrade
、origin
、origin-when-cross-origin
、unsafe-url
integrity
校驗fetch(`https://www.lilnong.top/cors/get?ref=SF`) .then(v=>v.json()) .then(v=>console.log(v))
由於get的不涉及到 content-type
因此還相對的簡單一些。下面咱們來針對不一樣的 content-type
寫一下
fetch(`https://www.lilnong.top/cors/post?ref=SF`,{ method:'post', headers: {'content-type':'application/json'}, body:JSON.stringify({bodyRef:'SF'}) }) .then(v=>v.json()) .then(v=>console.log(v))
fm = new FormData(); fm.append('type','formdata') fm.append('bodyRef','SF') fetch(`https://www.lilnong.top/cors/post?ref=SF`,{ method:'post', body:fm }) .then(v=>v.json()) .then(v=>console.log(v))
fetch(`https://www.lilnong.top/cors/post?ref=SF`,{ method:'post', body:new URLSearchParams({type: 'URLSearchParams',bodyRef:'SF'}) }) .then(v=>v.json()) .then(v=>console.log(v))
上傳文件只能使用multipart/form-data
。因此咱們就是用FormData
對象。有時候咱們須要給文件添加 filename
。
fm.append(name,value,filename)
value裏面放 Blob
對象或者File
均可以。這裏能夠傳入 filename
。
File
對象自帶 filename
, new File(fileBits, fileName, options)
能夠把 Blob
初始化成 File
對象。
fetch(`//cors-www.lilnong.top/static/img/wx-linong.jpg`) .then(v=>v.blob()) .then(v=>console.log(v,URL.createObjectURL(v)))