Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

统一API风格的跨平台请求库,支持Web/微信小程序/uni-app/Taro。

Notifications You must be signed in to change notification settings

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

统一API风格的跨平台请求库,支持Web/微信小程序/uni-app/Taro。

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /