前端最基础的就是 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)))