Skip to content

zhuddan/request

Repository files navigation

@zd~/request npm version

一个简单的请求库封装,支持web/uni-app/原生微信小程序

约定

注意:目的是统一不用平台的请求风格和类型的相对统一,约定如下

  • get请求不支持data传递参数, 请使用params代替
  • 不支持 httpRequest({...xxx})方式进行请求,请使用httpRequest.get({...xxx})显示声明请求方法代替
  • 公共参数:
    参数 说明
    baseUrl 同axios的baseURL
    getResponse 返回原生响应, 而不是服务器自定义返回
    RequestInterceptors axios 拦截器

如何使用?

web

  1. 安装依赖 axios qs @zd~/request
npm i axios qs @zd~/request
yarn add axios qs @zd~/request
pnpm add axios qs @zd~/request
  1. 声明自定义参数:
export interface CustomConfig {
/**
 * @description 是否需要token
 */
  withToken?: boolean
};
  1. 实例化
import { HttpRequest } from '@zd~/request'
export const request = new HttpRequest<CustomConfig>({
  baseURL: import.meta.env.VITE_APP_API_URL,
  withToken: true, // 默认值
}, {
  request(config) {
    const token = getCacheToken()
    if (config?.withToken && token)
      config.headers![tokenKey] = `${tokenKeyScheme} ${token}`
    return config
  },

  requestError(e) {
    console.log(e)
  },

  async response(_response) {
    const config = _response.config as RequestConfig<CustomConfig>
    if (config.getResponse) {
      return _response // 返回原生相应
    }
    // 用户自定义返回
    const responseData = _response.data as ResponseResult<object>

    // 用户自定义返回
    if (responseData.code === 200)
      return responseData as any

    const msg = responseData.msg

    return handleError(msg)
  },

  responseError(error) {
    // 错误处理
    throw error
  },
})
  1. 使用
import { request } from '@/utils/request/index'
// 登录方法
export function login(data: {
  username: string
  password: string
  code: string
  uuid: string
}) {
  return request.post<{
    token: string
  }>({
    url: '/login',
    data,
    withToken: false,
  })
}
export function login2(data: {
  username: string
  password: string
  code: string
  uuid: string
}) {
  return request.post<{
    token: string
  }>({
    url: '/login',
    data,
    getResponse: true
  })
}

const data = {
  username: 'xxx',
  password: 'xxx',
  code: 'xxx',
  uuid: 'xx',
}
const res1 = await login(data) // ==> ResponseResult<{ token: string }>
const res2 = await login(data) // ==> AxiosResponse<ResponseResult<Api.LoginResponse>, any>

完整示例

uni-app / 微信小程序

  1. 安装依赖 @zd~/request
npm i @zd~/request
yarn add @zd~/request
pnpm add @zd~/request
  1. 声明自定义参数:
export interface CustomConfig {
/**
 * @description 是否需要token
 */
  withToken?: boolean
};
  1. 实例化

Important

请使用 import { UniRequest } from '@zd~/request/uni' 而不是 import { UniRequest } from '@zd~/request' 导入
微信小程序同理 使用 import { WxRequest } from '@zd~/request/wx' 而不是 import { WxRequest } from '@zd~/request' 导入

import { UniRequest } from '@zd~/request/uni'
// 微信小程序
// import { WxRequest } from '@zd~/request/wx'

export const request = new UniRequest<HttpRequestUserConfig>({
  baseUrl: '',
  withToken: true,
}, {
  request(_config) {
    const config = Object.assign({
      ..._config,
    }) as RequestConfig<HttpRequestUserConfig>

    if (config.params !== undefined) {
      if (config.method?.toUpperCase() === RequestMethodsEnum.GET) {
        if (!isString(config.params)) {
          const params = removeUndefinedKeys(config.params)
          const _params = Object.assign(params || {}, params || {}, joinTimestamp(true, false))
          config.data = removeUndefinedKeys(_params)
        }
        else {
          config.url = `${config.url + config.params}${joinTimestamp(true, true)}`
        }
      }
      else {
        if (!isString(config.params)) {
          config.url = setParams(config.url as string, Object.assign({}, config.params))
        }
        else {
        // 兼容restful风格
          config.url = config.url + config.params
        }
      }
    }

    /**
     * token
     */
    const token = getCacheToken()
    const whiteUrlPrefix = `${config.baseUrl}/api/`
    const isWhiteUrl = config.url!.startsWith(whiteUrlPrefix)
    const withToken = config.withToken && `${config.withToken}` === 'true'

    if (withToken && !isWhiteUrl) {
      if (token) {
        config.header = {
          [tokenKey]: `${tokenKeyScheme} ${token}`,
          ...config.header,
        }
      }
      else {
        throw new Error('no token')
      }
    }
    return config
  },

  requestError(e) {

  },

  async response({ config, response }) {
    const { data, statusCode } = response
    if (statusCode !== 200) {
      const msg = getSystemErrorMessage(statusCode)
      return handleError(msg)
    }

    if (config.getResponse) {
      return response
    }

    const responseData = data as ResponseResult<object>

    if (responseData.code === 200) {
      return responseData as any
    }

    const msg = responseData.msg || getSystemErrorMessage(responseData.code)
    return handleError(msg, responseData.code !== 401 && !config?.showErrorMsg)
  },

  responseError(error: any) {
    throw error
  },
})
  1. 使用 略

uniapp完整示例

微信小程序完整示例

备注:

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published