加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

全面分析前端的网络请求方式

发布时间:2019-03-28 22:33:46 所属栏目:优化 来源:ConardLi
导读:一、前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本参数(url,请求方式) 请求参数、请求参数类型 设置请求头 获取响应的方式 获取响应头、响应状态、响应结果 异常处理 携带cookie设置 跨域请求 二、前

consumed函数:

  1. function consumed(body) {  
  2.   if (body.bodyUsed) {  
  3.     return Promise.reject(new TypeError('Already read'))  
  4.   }  
  5.   body.bodyUsed = true  
  6. }  

每次调用text()、json()等函数后会将bodyUsed变量变为true,用来标识返回值已经读取过了,下一次再读取直接抛出TypeError('Already read')。这也遵循了原生fetch的原则:

因为Responses对象被设置为了 stream 的方式,所以它们只能被读取一次

十、fetch的坑点

VUE的文档中对fetch有下面的描述:

使用fetch还有很多别的注意事项,这也是为什么大家现阶段还是更喜欢 axios 多一些。当然这个事情在未来可能会发生改变。

由于fetch是一个非常底层的API,它并没有被进行很多封装,还有许多问题需要处理:

  • 不能直接传递JavaScript对象作为参数
  • 需要自己判断返回值类型,并执行响应获取返回值的方法
  • 获取返回值方法只能调用一次,不能多次调用
  • 无法正常的捕获异常
  • 老版浏览器不会默认携带cookie
  • 不支持jsonp

十一、对fetch的封装

请求参数处理

支持传入不同的参数类型:

  1. function stringify(url, data) {  
  2.   var dataString = url.indexOf('?') == -1 ? '?' : '&';  
  3.   for (var key in data) {  
  4.     dataString += key + '=' + data[key] + '&';  
  5.   };  
  6.   return dataString;  
  7. }  
  8. if (request.formData) {  
  9.   requestrequest.body = request.data;  
  10. } else if (/^get$/i.test(request.method)) {  
  11.   request.url = `${request.url}${stringify(request.url, request.data)}`;  
  12. } else if (request.form) {  
  13.   request.headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');  
  14.   request.body = stringify(request.data);  
  15. } else {  
  16.   request.headers.set('Content-Type', 'application/json;charset=UTF-8');  
  17.   request.body = JSON.stringify(request.data);  
  18. }  

cookie携带

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读