React中fetch---基本使用
<p align="center"><strong>R</strong><strong>eact中</strong><strong>fetch---基本使用</strong></p><p><strong><span style="font-family: 微软雅黑">一、</span>fetch</strong></p>
<p>fetch是一种XMLHttpRequest的一种替代方案,在工作当中除了用ajax获取后台数据外我们还可以使用fetch、axios来替代ajax</p>
<p><strong><span style="font-family: 微软雅黑">二、</span>fetch的基本使用</strong></p>
<p>fetch(url).then(res => {</p>
<p> return res.json() <span style="font-family: Consolas">//res</span><span style="font-family: 微软雅黑">不是需要的请求数据</span></p>
<p> }).then(data => {</p>
<p> <span style="font-family: Consolas">console.log(data) //data</span><span style="font-family: 微软雅黑">是请求数据</span></p>
<p> }).catch(e =>{</p>
<p> <span style="font-family: Consolas">console.log(e) //e</span><span style="font-family: 微软雅黑">是异常信息</span></p>
<p> })</p>
<p><strong> </strong></p>
<p><strong> 说明:</strong></p>
<p><strong> </strong>1、fetch的返回值是一个promise对象</p>
<p><span style="font-family: 宋体"> </span>2、options</p>
<p> method:HTTP请求方式,默认是GET</p>
<p> body:请求的参数</p>
<p><span style="font-family: 宋体"> 因为</span>JSON内容是必须的,所以当设置主体时会调用JSON.stringify。</p>
<p class="pre"> <strong>fetch</strong><strong>(url</strong><strong>, </strong><strong>{</strong><strong><br></strong><strong> </strong><strong> </strong><strong>method</strong><strong>: </strong><strong>'delete'</strong><strong>,</strong><strong><br></strong><strong> </strong><strong> </strong><strong>headers</strong><strong>: {</strong><strong><br></strong><strong> </strong><strong> </strong><strong>'Content-Type'</strong><strong>: </strong><strong>'application/json'</strong><strong><br></strong><strong> </strong><strong> </strong><strong>}</strong><strong>,</strong><strong><br></strong><strong> </strong><strong> </strong><strong>body</strong><strong>: </strong><strong><em>JSON</em></strong><strong>.</strong><strong>stringify</strong><strong>({</strong><strong> <span style="font-family: Consolas">//</span><span style="font-family: 宋体">在服务器端通过</span><span style="font-family: Consolas">req.body.eid</span><span style="font-family: 宋体">方式获取</span></strong><strong><br></strong><strong> </strong><strong> </strong><strong>eid</strong><strong>: id</strong><strong><br></strong><strong> </strong><strong> </strong><strong> })</strong><strong><br></strong><strong> </strong><strong>}).</strong><strong>then</strong><strong>(res =>{</strong><strong><br></strong><strong> </strong><strong> </strong><strong>return </strong><strong>res.</strong><strong>json</strong><strong>()</strong><strong>;</strong><strong> <span style="font-family: Consolas">//</span><span style="font-family: 宋体">不是用户需要的数据</span><span style="font-family: Consolas">,</span><span style="font-family: 宋体">通过</span><span style="font-family: Consolas">return</span><span style="font-family: 宋体">返回</span></strong><strong><br></strong><strong> </strong><strong>}).</strong><strong>then</strong><strong>(data =>{</strong><strong> <span style="font-family: Consolas">//</span><span style="font-family: 宋体">用户需要的数据</span></strong><strong><br></strong><strong> </strong><strong> </strong><strong> </strong><strong><em>console</em></strong><strong>.</strong><strong>log</strong><strong>(data.msg)</strong><strong><br></strong><strong> </strong><strong>}).</strong><strong>catch</strong><strong>(e =>{</strong><strong><br></strong><strong> </strong><strong> </strong><strong><em>console</em></strong><strong>.</strong><strong>log</strong><strong>(e)</strong><strong><br></strong><strong> </strong><strong>})</strong></p>
<p><strong> </strong></p>
<p><strong>或</strong></p>
<p class="pre">fetch(url, {<br> method: 'delete',<br> headers: {<br> 'Content-Type': 'application/x-www-form-urlencoded'<br> },<br> body: "eid="+id<br> }).then(res =>{<br> return res.json();<br> }).then(data =>{<br> <em>console</em>.log(data.msg)<br> }).catch(e =>{<br> <em>console</em>.log(e)<br> })</p>
<p><strong> </strong>headers:HTTP请求头</p>
<p> <span style="font-family: 宋体">因为一般使用</span>JSON数据格式,所以设置ContentType为application/json</p>
<p> <span style="font-family: 宋体"> </span>credentials:默认为omit,忽略的意思,也就是不带cookie还有两个参数,same-origin,意思就是同源请求带cookie;include,表示无论跨域还是同源请求都会带cookie</p>
<p><strong>3、在.then里面第一个回调函数中处理response</strong></p>
<p><strong> </strong>status(number): HTTP返回的状态码,范围在100-599之间</p>
<p><span style="font-family: 宋体"> </span>statusText(String): 服务器返回的状态文字描述</p>
<p><span style="font-family: 宋体"> </span>headers: HTTP请求返回头</p>
<p><span style="font-family: 宋体"> </span>body: 返回体,这里有处理返回体的一些方法</p>
<p><span style="font-family: 宋体"> </span>text(): 将返回体处理成字符串类型</p>
<p><span style="font-family: 宋体"> </span>json(): 返回结果和 JSON.parse(responseText)一样</p>
<p><span style="font-family: 宋体"> </span>blob(): 返回一个Blob,Blob对象是一个不可更改的类文件的二进制数据</p>
<p><span style="font-family: 宋体"> 如果请求一个</span>XML格式文件,则调用response.text。如果请求图片,使用response.blob方法</p>
<p><strong> 注意:</strong></p>
<p><strong> </strong>cookie传递</p>
<p><span style="font-family: 宋体"> 必须在</span>header参数里面加上credentials: 'include',才会如xhr一样将当前cookies带到请求中去</p>
<p><strong> <span style="font-family: 微软雅黑">例子:</span></strong></p>
<p>fetch("/restapi/shopping/v2/banners?consumer=1&type=1&latitude=39.930321&longitude=116.217377",{</p>
<p> headers:{'Content-Type': 'application/json'}</p>
<p> }).then(response => {</p>
<p> return response.json()</p>
<p> }).then((data)=>{</p>
<p> console.log(data)</p>
<p> })</p>
<p><strong><span style="font-family: 微软雅黑">总结:</span>fetch与axios的区别</strong></p>
<p><span style="font-family: 微软雅黑"> </span><span style="font-family: Consolas">axios("http://xxx/xxx.json</span><span style="font-family: 微软雅黑">?</span><span style="font-family: Consolas">a=123'").then((res)=>{</span></p>
<p> <span style="font-family: 微软雅黑"> </span> <span style="font-family: Consolas">console.log(res)</span>//这里的r是响应结果</p>
<p>})</p>
<p> </p>
<p><span style="font-family: 微软雅黑"> </span><span style="font-family: Consolas">fetch("http://www.baidu.com").then((res)=>{</span></p>
<p><span style="font-family: 微软雅黑"> </span><span style="font-family: Consolas">console.log(res);</span>//是一个综合各种方法的对象,并不是请求的数据</p>
<p><span style="font-family: 微软雅黑"> </span><span style="font-family: Consolas">})</span></p>
<p>fetch返回的是一个未处理的方法集合,我们可以通过这些方法得到我们想要的数据类型。如果我们想要json格式,就执行response.json(),如果我们想要字符串就response.text()</p>
<p><strong> </strong></p>
<p><strong>axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:</strong></p>
<p><span style="font-family: 宋体"> 从浏览器中创建</span> XMLHttpRequest</p>
<p><span style="font-family: 宋体"> 从</span> node.js 发出 http 请求</p>
<p><span style="font-family: 宋体"> 支持</span> Promise API</p>
<p> 拦截请求和响应</p>
<p> 转换请求和响应数据</p>
<p><span style="font-family: 宋体"> 自动转换</span>JSON数据</p>
<p><span style="font-family: 宋体"> 客户端支持防止</span>CSRF/XSRF</p>
<p> </p>
<p><strong>fetch:符合关注分离,没有将输入、输出和用事件来跟踪的状态混杂在一个对象里</strong><strong>,</strong><strong><span style="font-family: 微软雅黑">更加底层,提供的</span>API丰富(request, response)</strong><strong>,</strong><strong><span style="font-family: 微软雅黑">脱离了</span>XHR,是ES规范里新的实现方式</strong></p>
<p>1)fetchtch只对网络请求报错,对400,500都当做成功的请求,需要封装去处理</p>
<p>2)fetch默认不会带cookie,需要添加配置项</p>
<p>3)fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了量的浪费</p>
<p>4)fetch没有办法原生监测请求的进度,而XHR可以</p><br><br>
来源:https://www.cnblogs.com/lone5wolf/p/15831823.html
頁:
[1]