Open shenxuxiang opened 5 years ago
在开发过程中,我们向服务端发送请求,一般会使用三种方式, XMLHttpRequest(XHR),Fetch ,jQuery实现的AJAX。其中, XMLHttpRequest(XHR)和Fetch是浏览器的原生API,它们都是全局的方法。jquery的ajax其实是封装了XHR。接下来我们来看看Fetch如何使用。
Fetch 是基于 Promise 实现的,所以它的返回值是一个 Promise 对象。当请求返回一个代表错误的 HTTP 状态码时,从 fetch() 返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。
Fetch
Promise
HTTP
fetch()
reject
resolve
ok
false
默认情况下,fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项)。
fetch
cookies
session
credentials
需要支持的话,我们可以在项目中引入isomorphic-fetch,isomorphic-fetch 是对 whatwg-fetch和node-fetch的一种封装,你一份代码就可以在两种环境下跑起来了。
第一个参数是一个请求的url。第二个参数是一个可选参数,可以控制不同配置的 init 对象。方法返回一个 promise 对象。
promise
如果要在请求中携带凭据,请添加credentials: 'include'。如果你只想在请求URL与调用脚本位于同一起源处时发送凭据(cookie),请添加credentials: 'same-origin'。要确保浏览器不在请求中包含凭据,请使用 credentials: 'omit',这个也是默认值
credentials: 'include'
credentials: 'same-origin'
credentials: 'omit'
var formData = new FormData(); var photos = document.querySelector("input[type='file'][multiple]"); formData.append('title', 'My Vegas Vacation'); // 注意这里上传的是多个文件 formData.append('photos', photos.files); fetch(url, { method: 'POST', body: formData }) .then(response => { if (response.ok) { return response.json(); } throw 'the qequest failed'; }) .then(response => console.log('Success:', response)) .catch(error => console.error('Error:', error));
fetch(url, { method: 'POST', body: JSON.stringify(query), }) .then(response => { if (response.ok) { return response.blob(); } throw 'the qequest failed'; }) .then(data => { const blobURL = window.URL.createObjectURL(data); download(blobURL); }) .catch(error => console.error('Error:', error)); function download(url) { const a = document.createElement('a'); a.style.display = 'none'; a.download = '<文件名>'; a.href = url; a.click(); document.body.appendChild(a); document.body.removeChild(a); }
isomorphic-fetch
http
Fetch
在开发过程中,我们向服务端发送请求,一般会使用三种方式, XMLHttpRequest(XHR),Fetch ,jQuery实现的AJAX。其中, XMLHttpRequest(XHR)和Fetch是浏览器的原生API,它们都是全局的方法。jquery的ajax其实是封装了XHR。接下来我们来看看Fetch如何使用。
写在前面
Fetch
是基于Promise
实现的,所以它的返回值是一个Promise
对象。当请求返回一个代表错误的HTTP
状态码时,从fetch()
返回的Promise
不会被标记为reject
, 即使该HTTP
响应的状态码是 404 或 500。相反,它会将Promise
状态标记为resolve
(但是会将resolve
的返回值的ok
属性设置为false
),仅当网络故障时或请求被阻止时,才会标记为reject
。默认情况下,
fetch
不会从服务端发送或接收任何cookies
, 如果站点依赖于用户session
,则会导致未经认证的请求(要发送 cookies,必须设置credentials
选项)。兼容性
isomorphic-fetch
需要支持的话,我们可以在项目中引入isomorphic-fetch,isomorphic-fetch 是对 whatwg-fetch和node-fetch的一种封装,你一份代码就可以在两种环境下跑起来了。
fetch()的使用
第一个参数是一个请求的url。第二个参数是一个可选参数,可以控制不同配置的 init 对象。方法返回一个
promise
对象。init 对象有哪些属性
如果要在请求中携带凭据,请添加
credentials: 'include'
。如果你只想在请求URL与调用脚本位于同一起源处时发送凭据(cookie),请添加credentials: 'same-origin'
。要确保浏览器不在请求中包含凭据,请使用credentials: 'omit'
,这个也是默认值返回的response有哪些属性
用途
文件上传
文件下载
最后
fetch
的兼容性较差,所以不得不使用第三方插件,这里推荐isomorphic-fetch
。http
状态下如400 | 500等不会reject
,相反它会被resolve