牽著伱淂手 發表於 2022-1-21 21:20:00

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 =&gt; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return res.json()&nbsp;<span style="font-family: Consolas">//res</span><span style="font-family: 微软雅黑">不是需要的请求数据</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).then(data =&gt; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Consolas">console.log(data) //data</span><span style="font-family: 微软雅黑">是请求数据</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).catch(e =&gt;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Consolas">console.log(e) //e</span><span style="font-family: 微软雅黑">是异常信息</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})</p>
<p><strong>&nbsp;</strong></p>
<p><strong>  说明:</strong></p>
<p><strong>    </strong>1、fetch的返回值是一个promise对象</p>
<p><span style="font-family: 宋体">    </span>2、options</p>
<p>    &nbsp;&nbsp;&nbsp;method:HTTP请求方式,默认是GET</p>
<p>    &nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>method</strong><strong>: </strong><strong>'delete'</strong><strong>,</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>headers</strong><strong>: {</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>'Content-Type'</strong><strong>: </strong><strong>'application/json'</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>}</strong><strong>,</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>body</strong><strong>: </strong><strong><em>JSON</em></strong><strong>.</strong><strong>stringify</strong><strong>({</strong><strong>&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>eid</strong><strong>: id</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;})</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>}).</strong><strong>then</strong><strong>(res =&gt;{</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>return </strong><strong>res.</strong><strong>json</strong><strong>()</strong><strong>;</strong><strong>&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>}).</strong><strong>then</strong><strong>(data =&gt;{</strong><strong>&nbsp;<span style="font-family: Consolas">//</span><span style="font-family: 宋体">用户需要的数据</span></strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;</strong><strong><em>console</em></strong><strong>.</strong><strong>log</strong><strong>(data.msg)</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>}).</strong><strong>catch</strong><strong>(e =&gt;{</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong><em>console</em></strong><strong>.</strong><strong>log</strong><strong>(e)</strong><strong><br></strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong>})</strong></p>
<p><strong>&nbsp;</strong></p>
<p><strong>或</strong></p>
<p class="pre">fetch(url, {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method: 'delete',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Content-Type': 'application/x-www-form-urlencoded'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body: "eid="+id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).then(res =&gt;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return res.json();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).then(data =&gt;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>console</em>.log(data.msg)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).catch(e =&gt;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>console</em>.log(e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})</p>
<p><strong>    </strong>headers:HTTP请求头</p>
<p>    &nbsp;<span style="font-family: 宋体">因为一般使用</span>JSON数据格式,所以设置ContentType为application/json</p>
<p>&nbsp;<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>&nbsp;<span style="font-family: 微软雅黑">例子:</span></strong></p>
<p>fetch("/restapi/shopping/v2/banners?consumer=1&amp;type=1&amp;latitude=39.930321&amp;longitude=116.217377",{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers:{'Content-Type': 'application/json'}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).then(response =&gt; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return response.json()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).then((data)=&gt;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(data)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})</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)=&gt;{</span></p>
<p>&nbsp;&nbsp;&nbsp;<span style="font-family: 微软雅黑">  </span> <span style="font-family: Consolas">console.log(res)</span>//这里的r是响应结果</p>
<p>})</p>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">  </span><span style="font-family: Consolas">fetch("http://www.baidu.com").then((res)=&gt;{</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>&nbsp;</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>&nbsp;</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]
查看完整版本: React中fetch---基本使用