RN实战项目网络请求封装(二)

RN实战项目网络请求封装(二)

网络相关学习文档,参考 RN中文网文档

RN中主要是用fetch来完成异步网络请求的,传统的ajax慢慢的会被fetch替代

RN中文网fetch API 案例

fetch(‘https://mywebsite.com/endpoint/‘, {
  method: ‘POST‘, //请求方法 默认get
  headers: {
    ‘Accept‘: ‘application/json‘,
    ‘Content-Type‘: ‘application/json‘, //数据格式 json或者key-value形式
  },
  body: JSON.stringify({ //json对象转换为json字符串
    firstParam: ‘yourValue‘,
    secondParam: ‘yourOtherValue‘,
  })
})

getMoviesFromApiAsync() {
    return fetch(‘https://facebook.github.io/react-native/movies.json‘)
      .then((response) => response.json())//回调结果,并转换为json对象 es6写法
      .then((responseJson) => {
        return responseJson.movies; //给调用者返回数据集合
      })
      .catch((error) => {
        console.error(error); //网络请求出现错误,或者getMoviesFromApiAsync 函数调用者自身出现错误都会被这里catch住
      });
 }

项目中NetUtils封装

import React,{Component} from ‘react‘;

//这里引入了一个md5加密的库,Github https://github.com/kmend/react-native-md5
//引入方式很简单,npm install react-native-md5 --save
//然后打开项目的package.json 查看,发现此时多了一个依赖 

import MD5 from "react-native-md5";
import {
    ToastAndroid,
} from ‘react-native‘;

/**
 * 网络请求的工具类
 */
export default class NetUtils extends Component{

    //构造函数,默认的props,以及state 都可以在这里初始化了
    constructor(props){
        super(props);
    }

    /**
     * 普通的get请求
     * @param {*} url 地址
     * @param {*} params  参数
     * @param {*} callback  成功后的回调
     */
    static get(url,params,callback){
       fetch(url,{
        method:‘GET‘,
        body:params
        })
        .then((response) => {
            if(response.ok){//如果相应码为200
                return response.json(); //将字符串转换为json对象
            }
        })
        .then((json) => {
            //根据接口规范在此判断是否成功,成功后则回调
            if(json.resultCode === "SUCCESS"){
                callback(json);
            }else{
                //否则不正确,则进行消息提示
                //ToastAndroid 只针对安卓平台,并不跨平台
                ToastAndroid.show(json.resultDesc,ToastAndroid.SHORT);
            }
        }).catch(error => {
            ToastAndroid.show("netword error",ToastAndroid.SHORT);
        });
    };

    /**
     * post key-value 形式 hader为‘Content-Type‘: ‘application/x-www-form-urlencoded‘
     * @param {*} url
     * @param {*} service
     * @param {*} params
     * @param {*} callback
     */
    static post(url,service,params,callback){
        //添加公共参数
        var newParams = this.getNewParams(service,params);//接口自身的规范,可以忽略

        fetch(url,{
        method:‘POST‘,
        headers:{
            ‘Content-Type‘: ‘application/x-www-form-urlencoded;charset=UTF-8‘//key-value形式
        },
        body:newParams
        })
        .then((response) => {
            if(response.ok){
               return response.json();
            }
        })
        .then((json) => {
            if(json.resultCode === "SUCCESS"){
                callback(json);
            }else{
                ToastAndroid.show(json.resultDesc,ToastAndroid.SHORT);
            }
        }).catch(error => {
            alert(error);
            //ToastAndroid.show("netword error",ToastAndroid.SHORT);
        });
    };

    /**
     * post json形式  header为‘Content-Type‘: ‘application/json‘
     * @param {*} url
     * @param {*} service
     * @param {*} jsonObj
     * @param {*} callback
     */
    static postJson(url,service,jsonObj,callback){
        fetch(url,{
        method:‘POST‘,
        headers:{
          ‘Content-Type‘: ‘application/json;charset=UTF-8‘
        },
        body:JSON.stringify(jsonObj),//json对象转换为string
        })
        .then((response) => {
            if(response.ok){
                return response.json();
            }
        })
        .then((json) => {
            if(json.resultCode === "SUCCESS"){
                callback(json);
            }else{
                ToastAndroid.show(json.resultDesc,ToastAndroid.SHORT);
            }
        }).catch(error => {
            ToastAndroid.show("netword error",ToastAndroid.SHORT);
        });
    };

    /**
     * 获取当前系统时间 yyyyMMddHHmmss
     */
    static getCurrentDate(){
        var space = "";
        var dates = new Date();
        var years = dates.getFullYear();
        var months = dates.getMonth()+1;
        if(months<10){
            months = "0"+months;
        }

        var days = dates.getDate();
        if(days<10){
            days = "0"+days;
        }

        var hours = dates.getHours();
        if(hours<10){
            hours = "0"+hours;
        }

        var mins =dates.getMinutes();
        if(mins<10){
            mins = "0"+mins;
        }

        var secs = dates.getSeconds();
        if(secs<10){
            secs = "0"+secs;
        }
        var time = years+space+months+space+days+space+hours+space+mins+space+secs;
        return time;
    };

    /**
     * 设置公共参数
     * @param {*} service  服务资源类型
     * @param {*} oldParams 参数 key-value形式的字符串
     * @return 新的参数
     */
    static getNewParams(service,oldParams){
        var newParams = "";
        var currentDate = this.getCurrentDate();
        var MD5KEY = "XXXXXX";
        var digestStr = MD5KEY+service+currentDate+MD5KEY;
        newParams = oldParams+"&timestamp="+currentDate+"&digest="+this.MD5(digestStr);
        return newParams;
    };

    /**
     * 字符串加密
     * @param {*} str
     */
    static MD5(str){
        return MD5.hex_md5(str);
    };

    /**
     * 获取当前系统时间 yyyyMMddHH
     */
    static getCurrentDateFormat(){
        var space = "";
        var dates = new Date();
        var years = dates.getFullYear();
        var months = dates.getMonth()+1;
        if(months<10){
            months = "0"+months;
        }

        var days = dates.getDate();
        if(days<10){
            days = "0"+days;
        }
        var time = years+space+months+space+days;
        return time;
    };
}

测试并使用

import NetUtils from ‘../net/NetUtils‘;

/**
 * 首页
 */
export default class Index extends Component {

    constructor(props) {
        super(props);
    }

    componentDidMount() {
        //加载数据
        var url = ‘http://192.168.2.112:8042/ShengDaAutoPlatform/remit!clerkDetail‘;
        var service = "clerkDetail";
        var userInfo;
        AsyncStorage.getItem("userInfo", (error, result) => {
            if (error) {

            } else {
                userInfo = eval(‘(‘ + result + ‘)‘);
                var params = "service=clerkDetail&pageSize=10&page=1&userId=" + userInfo.userId;
                NetUtils.post(url, service, params, (result) => {
                    ToastAndroid.show(result.resultDesc, ToastAndroid.SHORT);
                });
            }
        });
    };
  }
}

由于NetUtils是一个外部的js文件,所以在使用的地方一定要记得import NetUtils from ‘../net/NetUtils’;

这里遇到的坑:

一:import 的时候 NetUtils.js 后面的.js可以去掉,路径填写相对路径

二:NetUtils.js里面 export default class NetUtils extends Component{} 组件必须export default 声明,切记一个js文件中只能有且仅有一个default声明

三:get post postJson方法都用了static 声明,直接NetUtils.post/get/postJosn即可

END

简 书博客:http://www.jianshu.com/p/1cda2b889d47

时间: 2024-10-24 13:26:12

RN实战项目网络请求封装(二)的相关文章

网络请求封装

网络请求封装 // // ASIHTTPRequest+Request.h // CloudShopping // // Created by sixiaobo on 14-7-9. // Copyright (c) 2014年 com.Uni2uni. All rights reserved. // #import "ASIFormDataRequest.h" #import "ASIDownloadCache.h" // downloadData是返回的数据,如

Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的

在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到Afinal框架,不会用Afinal的童鞋可以先看一下上一篇博文),正所谓麻雀虽小,五脏俱全,这在里我会尽量的将前期的项目搭建做的相对实用一些,以便后期可以有效的实现团队协作和项目维护.一开始可能会看起来麻烦些,可能会觉得还不如直接用简单的方式去实现来的方便,磨刀不误砍柴工嘛,要想后期开发效率高一些,前期就不要图省事了. 一个项目肯定不是一蹴而就的,咱们一步一步来,本篇博文先详细介绍项目搭建.通过url地

iOS开发——post异步网络请求封装

IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异步的,post的请求方式.通过ios的原生函数简单封装.通过这个封装可以方便的访问http服务器,获取数据,也可以容易的异步加载网络图片. 首先新建一个httpHelper类,在这个类里进行封装,封装的函数名称就叫做post,参数有请求的地址url,请求的参数params,返回数据后回调的函数blo

React Native 网络请求封装:使用Promise封装fetch请求

React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRequest 是一个设计粗糙的 API,不符合职责分离的原则,配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise 友好.而Fetch 的出现就是为了解决 XHR 的问题,所以ReactNative官方推荐使用Fetch API.http://blog.csdn.net/withings/article/details/71331726 fet

RxJava2+Retrofit2+RxLifecycle3+OkHttp3网络请求封装(动态演示)

入职公司后,公司要求组件化开发,经过讨论后我将网络请求框架单独进行了封装,不过当时框架里将常用的 util 和 ui 均放入到了共同的 Common 包下,导致里面部分代码耦合,后来为了降低耦合性又将 Common 拆分为了lib_common和lib_ui,但是 lib_ui 依赖了 lib_common,还是导致部分代码耦合,最新一期为了降低组件之间的耦合性,所以单独将 lib_common 中的网络请求单独拆分,并且我又做了新的封装和完善,总之网络框架经过3次大的改造后,使用已经非常稳定了

Flutter -------- Http库 网络请求封装(HttpController)

http库 再次封装的网络请求类 HttpController 1.添加依赖 dependencies: http: ^0.12.0 #latest version 2.导入库 import 'package:http/http.dart' as http; //导入前需要配置 效果图: 封装类 import 'package:http/http.dart' as http; class HttpController { static void get(String url, Function

Python实战项目网络爬虫 之 爬取小说吧小说正文

本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 链接:http://tieba.baidu.com/p/4792877734 首先,自己定义一个类,方便使用.其实类就像一个"水果篮",这个"水果篮"里有很多的"水果",也就是我们类里面定义的变量啊,函数啊等等,各种各样的.每一种"水果&q

简单网络请求封装

// // HTTPRequset.h // 请求类分装 // // Created by qianfeng on 15-7-26. // Copyright (c) 2015年 qq. All rights reserved. // //通过代理和block实现函数回调,可选其一 #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @class HTTPRequset; @protocol HTTPRequsetDe

业务层网络请求封装

网络请求 - 是否异步 - 参数字典 (本身参数 系统环境参数, 默认参数) - 遮罩层 - 报错提示 - url 网络参数类(RequestParam) userid: NSString * entid: NSString * appid: NSString * secret: NSString * paramDict: NSDictionary * + (instancetype) DefaultRequestParam; + (void)setSharedRequestParam; 网络请