美文网首页
React Native 网络请求封装ajax

React Native 网络请求封装ajax

作者: 刘宇航iOS | 来源:发表于2018-10-25 10:10 被阅读143次
    1.新建Fetch.tsx(作者采用的是TypeScript)
    import _ from 'lodash'
    import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
    import {Toast} from "antd-mobile-rn"
    
    import {DeviceEventEmitter} from 'react-native'
    import config from "./config";
    
    interface ajaxOptions {
      baseURL?: string
      version?: string
      headers?: object
      method?: string
      data?: object
    }
    
    export const ajax = (url: string, options: ajaxOptions) => {
      let axiosOptions: AxiosRequestConfig = {}
      axiosOptions.baseURL = config.host
      axiosOptions.headers = {
    //无请求头可忽略
        Authorization:'BasicAuth ' + config.ticket,
        ...options.headers
      }
    //请求方式
      axiosOptions.method = options.method || 'get'
    //超时时间
      axiosOptions.timeout = 30 * 1000
    
      if (options.data && _.includes(['get', 'delete'], options.method))
        axiosOptions.params = options.data
      else
        axiosOptions.data = options.data
    
      return new Promise<AJAXErrorResult>((resolve:any, reject:any) => {
        axios(url, axiosOptions)
          .then(async (res: AxiosResponse<ServerResponseData>) => {
    
            if(res.data.status === 1){
              resolve(res.data)
              return
              // @ts-ignore
            } else if (res.data.Status === 1) {
              resolve(res.data)
              return
            }
    
            Toast.fail(res.data.error)
            reject({
              ...res,
              handled:false
            })
          })
          .catch(async (err: AxiosError) => {
            console.warn(err)
            console.log(url,axiosOptions)
            if (!err.response) {
              Toast.fail('服务繁忙,稍候请重试')
              reject({ ...err, handled: true })
              return
            }
    
            if (err.response.status == 401) {
              reject({ handled: true })
              Toast.info('登录状态失效,请重新登录')
    
              DeviceEventEmitter.emit('LogoutEvent',null  )
            }
            else if (err.response.status == 400) {
              reject({
                data: err.response.data,
                message: _.get(err.response.data, 'msg'),
                handled: false
              })
            }
            else {
              reject({ ...err, handled: true })
              Toast.fail('服务繁忙,稍候请重试')
            }
          })
      })
    }
    
    export const GET = (url: string, options: ajaxOptions) => ajax(url, {
      ...options,
      method: 'get'
    })
    export const PUT = (url: string, options: ajaxOptions) => ajax(url, {
      ...options,
      method: 'put'
    })
    export const POST = (url: string, options: ajaxOptions) => ajax(url, {
      ...options,
      method: 'post'
    })
    export const DEL = (url: string, options: ajaxOptions) => ajax(url, {
      ...options,
      method: 'delete'
    })
    
    
    2.创建RequestHelper.ts
    //引用
    import { POST, GET, PUT, DEL } from "./Fetch";
    
    // 获取验证码
    export function requestForValidCode() {
      return GET('/api/User/GetValidateNumKey', {})
    }
    // 登录
    export function requestForlogin(params: FormLoginModel) {
      return POST('Api/User/UserLogin', {
        data: {
          ...params
        }
      })
    }
    
    
    3.使用RequestHelper
    requestForlogin({
          LoginName: phoneStr,
          LoginPass: password
        })
          .then((res: any) => {
           
          })
          .catch((err: any) => {
            if (!err.data.handled) {
            }
          })
    

    相关文章

      网友评论

          本文标题:React Native 网络请求封装ajax

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