详解React Native网络请求fetch简单封装


Posted in Javascript onAugust 10, 2017

在原生应用开发中,为了方便业务开发人员使用,我们一般会对网络库进行一些上传封装,而不是直接使用,例如基于AFNetworking库的iOS请求上层封装,Android的诸如volley,retrofit等。在前端开发中,一般使用fetch进行网络请求,相关介绍请查看fetch示例。其实对于开发来说,系统提供的fetch已经够用了,但是为了代码的整体结构,建议对fetch进行简单的Get/Post封装。

若不封装,我们看一下传统的写法:

fetch('http://www.pintasty.cn/home/homedynamic', {
      method: 'POST',
      headers: { //header
        'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJVLTliZGJhNjBjMjZiMDQwZGJiMTMwYWRhYWVlN2FkYTg2IiwiZXhwaXJhdGlvblRpbWUiOjE0NzUxMTg4ODU4NTd9.ImbjXRFYDNYFPtK2_Q2jffb2rc5DhTZSZopHG_DAuNU'
      },
      body: JSON.stringify({ //参数
        'start': '0',
        'limit': '20',
        'isNeedCategory': true,
        'lastRefreshTime': '2016-09-25 09:45:12'
      })
    })
      .then((response) => response.json()) //把response转为json
      .then((responseData) => { // 上面的转好的json
          alert(responseData); /
        // console.log(responseData);
      })
      .catch((error)=> {
        alert('错误了');
      })
  }

是不是看着有一种密集恐惧症,并且代码的风格也不是很好。所以,为了方便使用,我们需要将公共的部分封装起来,然后只需要通过参数的方式对外暴露出诸如请求Url,请求参数,Header就可以了。

var HTTPUtil = {};

/**
 * GET请求
 */
HTTPUtil.get = function(url, params, headers) {
  if (params) {
    let paramsArray = [];
    //encodeURIComponent
    Object.keys(params).forEach(key => paramsArray.push(key + '=' + params[key]))
    if (url.search(/\?/) === -1) {
      url += '?' + paramsArray.join('&')
    } else {
      url += '&' + paramsArray.join('&')
    }
  }
  return new Promise(function (resolve, reject) {
   fetch(url, {
      method: 'GET',
      headers: headers,
     })
     .then((response) => {
       if (response.ok) {
         return response.json();
       } else {
         reject({status:response.status})
       }
     })
     .then((response) => {
       resolve(response);
     })
     .catch((err)=> {
      reject({status:-1});
     })
  })
}


/**
 * POST请求 FormData 表单数据
 */
HTTPUtil.post = function(url, formData, headers) {
  return new Promise(function (resolve, reject) {
   fetch(url, {
      method: 'POST',
      headers: headers,
      body:formData,
     })
     .then((response) => {
       if (response.ok) {
         return response.json();
       } else {
         reject({status:response.status})
       }
     })
     .then((response) => {
       resolve(response);
     })
     .catch((err)=> {
      reject({status:-1});
     })
  })
}

export default HTTPUtil;

还是上面的例子,我们怎么使用呢?

let formData = new FormData(); 
formData.append("id",1060); 
 let url='http://www.pintasty.cn/home/homedynamic';
  let headers='';
HTTPUtil.post(url,formData,headers).then((json) => { 
  //处理 请求结果 
  },(json)=>{ 
   //TODO 处理请求fail   
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript网页关闭时提醒效果脚本
Oct 22 Javascript
获取焦点时,利用js定时器设定时间执行动作
Apr 02 Javascript
jquery中change()用法实例分析
Feb 06 Javascript
JavaScript实现的多种鼠标拖放效果
Nov 03 Javascript
跟我学习javascript的执行上下文
Nov 18 Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 Javascript
Bootstrap表单控件学习使用
Mar 07 Javascript
Three.js基础学习之场景对象
Sep 27 Javascript
swiper4实现移动端导航切换
Oct 16 Javascript
jQuery实现获取多选框的值示例
Feb 07 jQuery
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 Javascript
vue监听键盘事件的相关总结
Jan 29 Vue.js
jQuery Ajax 实现分页 kkpager插件实例代码
Aug 10 #jQuery
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
Aug 10 #Javascript
jquery.uploadView 实现图片预览上传功能
Aug 10 #jQuery
express框架实现基于Websocket建立的简易聊天室
Aug 10 #Javascript
bootstrap table服务端实现分页效果
Aug 10 #Javascript
AngularJs+Bootstrap实现漂亮的计算器
Aug 10 #Javascript
React-Native做一个文本输入框组件的实现代码
Aug 10 #Javascript
You might like
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
js验证表单大全
2006/11/25 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python 处理图片像素点的实例
2019/01/08 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
Python flask框架端口失效解决方案
2020/06/04 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
店面销售职位的职责
2014/03/09 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
活动总结模板大全
2015/05/11 职场文书
调解书格式范本
2015/05/20 职场文书
运动会班级前导词
2015/07/20 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
swagger如何返回map字段注释
2021/07/03 Java/Android
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL