详解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 相关文章推荐
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
解析JavaScript的ES6版本中的解构赋值
Jul 28 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
JavaScript重载函数实例剖析
May 13 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
js实现前面自动补全位数的方法
Oct 10 Javascript
vuejs简单验证码功能完整示例
Jan 08 Javascript
微信小程序上线发布流程图文详解
May 06 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
Aug 16 Javascript
微信小程序 select 下拉框组件功能
Sep 09 Javascript
使用layer.msg 时间设置不起作用的解决方法
Sep 12 Javascript
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 发送数据
2006/10/09 PHP
PHP has encountered an Access Violation
2007/01/15 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
php 静态页面中显示动态内容
2009/08/14 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
Javascript缓存API
2016/06/14 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
python小程序实现刷票功能详解
2019/07/17 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
小学生安全演讲稿
2014/04/25 职场文书
社会实践评语
2014/04/28 职场文书
机电一体化专业求职信
2014/07/22 职场文书
anaconda python3.8安装后降级
2021/06/11 Python
利用Pycharm连接服务器的全过程记录
2021/07/01 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python