详解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中删除指定数组中指定的元素的代码
Feb 12 Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 Javascript
window.onload使用指南
Sep 13 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
angular4应用中输入的最小值和最大值的方法
May 17 Javascript
js 实现watch监听数据变化的代码
Oct 13 Javascript
vue 取出v-for循环中的index值实例
Nov 09 Javascript
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
js正则表达式简单校验方法
Jan 03 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
文件上传的实现
2006/10/09 PHP
php简单smarty入门程序实例
2015/06/11 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
node.js基础知识小结
2018/02/26 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
Python中多线程及程序锁浅析
2015/01/21 Python
关于Python数据结构中字典的心得
2017/12/04 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
python 标准差计算的实现(std)
2019/07/29 Python
python3 mmh3安装及使用方法
2019/10/09 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
移动端HTML5 input常见问题(小结)
2020/09/28 HTML / CSS
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
农村结婚典礼司仪主持词
2014/03/14 职场文书
作风整顿剖析材料
2014/09/30 职场文书
师德师风学习材料
2014/12/19 职场文书
HAM-2000摩机图
2021/04/22 无线电
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python