美文网首页RN知识RN 项目使用组件
RN-自定义中间件(网络请求)

RN-自定义中间件(网络请求)

作者: 精神病患者link常 | 来源:发表于2018-05-07 15:11 被阅读73次

store => next => action =>{}
这就是一个中间件的声明方式

下面就是一个简单的中间件,什么功能也没有

export default store => next => action => {

    console.log('自定义中间件-action:',action);

     return next(action);
}

这种只要dispatch(action),都会走这个方法。

现在我想dispatch(httpAction),然后进行网络请求,所以要改造一下这个函数。

import {
    ACTION_MIDDLEWARE_HTTP
} from '../constance/actionType';
export default store => next => action => {

    console.log('自定义中间件-action:',action);

    // 如果不是网络请求的action,就继续往下走
    if(action.type !== ACTION_MIDDLEWARE_HTTP)
        return next(action);

    // 下面就是网络请求的代码
    console.log('网络请求中间件的参数:',action.payload);


}

action.js

export const ACTION_MIDDLEWARE_HTTP = createAction(Action.ACTION_MIDDLEWARE_HTTP);

home.js

<TouchableOpacity style={styles.button} onPress={()=>{
               this.props.httpMiddleWare('进行网络请求');
            }}>
                <Text style={styles.buttonText}>点击发送Action,进行中间件(网络请求)</Text>
            </TouchableOpacity>
 httpMiddleWare:(value)=>{
            dispatch(ACTION_MIDDLEWARE_HTTP(value));
        }

完整的中间件代码

/**
 * Created by chj on 2018/5/7.
 */
import {
    ACTION_MIDDLEWARE_HTTP
} from '../constance/actionType';

const headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
};

const imageHeaders = {
    "Content-Type": "multipart/form-data",
};
export default store => next => action => {

    console.log('自定义中间件-action:',action);

    if(action.type !== ACTION_MIDDLEWARE_HTTP)
        return next(action);


    console.log('网络请求中间件的参数:',action.payload);

    const {
        url,
        method = 'POST', // 如果没有传,则默认是 POST 方式
        params = {},     // 默认 空
        loading,         // 回调函数,网络请求开始
        success,         // 回调函数,网络请求成功
        fail,            // 回调函数,网络请求失败
        complete         // 回调函数,网络请求结束
    } = action.payload;

    loading();

    fetch(url,
        {
            method: method,
            headers,
            body: params,
        })
        .then(response=>{
            return response.json()
        })
        .then(responseData=>{
            success(responseData)
        })
        .catch(error=>{
            fail(error)
        })
        .finally(()=>{
            complete();
        })

}

home.js

this.props.httpMiddleWare({
                   url: 'url',
                   params: {keu1:'1',key2: '2'},
                   loading: this.loading,
                   success: this.success,
                   fail: this.fail,
                   complete: this.complete
               });
 // 网络开始请求
    loading() {
        // 在此处可以进行网络请求前的操作,比如显示loading...
        console.log('网络开始请求...转圈圈');
    }
    success(responseData) {
        // 网络请求成功返回数据
        console.log('网络请求成功:', responseData);
    }
    fail(error) {
        // 网络请求失败返回数据 error
        console.log('网络请求错误:', error);

    }
    complete() {
        // 网络请求完成处理,比如取消loading...
        console.log('网络请求结束...不转圈圈');
    }
image.png

axios进行网络请求中间件代码

/**
 * Created by chj on 2018/5/7.
 */
import {
    ACTION_MIDDLEWARE_HTTP
} from '../constance/actionType';
import axios from 'axios'

const timeout = 60000;

const headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
};

const imageHeaders = {
    "Content-Type": "multipart/form-data",
};
export default store => next => action => {

    console.log('自定义中间件-action:',action);

    if(action.type !== ACTION_MIDDLEWARE_HTTP)
        return next(action);


    console.log('网络请求中间件的参数:',action.payload);

    const {
        url,
        method = 'POST', // 如果没有传,则默认是 POST 方式
        params = {}, // 默认 空
        loading,
        success,
        fail,
        complete
    } = action.payload;

    loading();

    // 设置url
    axios.defaults.baseURL = 'https://api.example.com';

    // 设置默认的header
    //axios.defaults.headers.DeviceId = ''

    // 设置数据类型
    //axios.defaults.headers.post['Content-Type'] = 'application/json';

    // 添加请求拦截器
    axios.interceptors.request.use(function (config) {
        // 在发送请求之前做些什么
        return config;
    }, function (error) {
        // 对请求错误做些什么
        return Promise.reject(error);
    });

    // 添加响应拦截器
    axios.interceptors.response.use(function (response) {
        // 对响应数据做点什么
        return response;
    }, function (error) {
        // 对响应错误做点什么
        return Promise.reject(error);
    });

    // 发送请求
    axios({
        url: url,
        method: method,
        headers: headers,
        data: params,
        timeout: timeout,
        responseType: 'json',
        onUploadProgress: (progressEvent)=>{
            console.log('progressEvent:', progressEvent);
        },
        onDownloadProgress: (downloadEvent)=>{
            console.log('downloadEvent:', downloadEvent);
        }
    }).then(response =>{
        success(response);
    }).catch(error =>{
        fail(error);
    }).finally(()=>{
        complete();
    })
}

相关文章

  • RN-自定义中间件(网络请求)

    store => next => action =>{}这就是一个中间件的声明方式 下面就是一个简单的中间件,什么...

  • 状态背景视图SYStatusView

    网络状态,分以下几种情况 开始网络请求菊花转提示自定义图标、提示语 结束网络请求,成功自定义图标、提示语自定义图标...

  • ASP.NET Core笔记(5) - 中间件

    中间件管道模型 中间件的配置 自定义中间件 中间件是一类装配在应用管道的代码,负责处理请求和响应。每个中间件都可在...

  • 分析实现-离散请求

    原文地址 网络层作为App架构中至关重要的中间件之一,承担着业务封装和核心层网络请求交互的职责。讨论请求中间件实现...

  • Django中自定义中间件模块--自动搜索stackoveflo

    Django的中间件MIDDLEWARE的分类: 请求期间: 返回期间: 如果需要自定义,在MIDDLEWARE_...

  • 第十一章 Express后端框架3

    中间件有三个参数:网络请求对象、服务器响应对象、next函数 Express网络请求的方法 1. req.para...

  • Okhttp 请求前获得请求体的内容

    描述: 应用中全局添加网络请求提示自定义Toast,即每个接口请求前显示自定义Dialog, 请求后不管成功还是失...

  • Koa2 使用 koa-static 增加文件资源权限的验证

    在使用 koa-static 中间件时,发现前台直接GET请求文件资源无法自定义headers(Element P...

  • laravel---中间件简笔

    #######判断是前置中间件还是后置中间件: 根据中间件的逻辑是在请求执行前还是请求执行后执行,如果逻辑在请求执...

  • Express

    中间件 中间件就是一堆方法,可以接受客户端发来的请求、可以对请求作出响应,也可以将请求交给下一个中间件处理中间件有...

网友评论

    本文标题:RN-自定义中间件(网络请求)

    本文链接:https://www.haomeiwen.com/subject/rvomrftx.html