Skip to content
On this page

XHTTP

xhttp 模块是基于 axios 二次封装,在 axios 的基础上增加了一些适配后台管理系统的功能。

功能

axios 功能参考官方文档:起步 | Axios中文文档 | Axios中文网 (axios-http.cn)

xhttp 除了支持 axios 的基础功能之外,封装了以下功能:

功能介绍
消息提示成功/失败/错误等消息和模态弹窗提示 在浏览器端使用消息和模态弹窗提示 在node 端使用 console 打印
忽略重复请求
超时重试
加入请求时间戳请求时间戳可以用于调试接口
上传文件默认采用 formdata 格式上传文件默认配置: header:{Content-type: FORM_DATA = 'multipart/form-data;charset=UTF-8',}
固定状态码提示和处理
ajax 错误日志收集钩子addAjaxErrorInfo
全局请求 token
token 校验
token 刷新传入 token 过期时间和时间间隔,在每次请求之前自动判断当前时间与 token 过期时间差小于指定刷新间隔时间,如果是,自动请求刷新 Token 接口刷新 Token,并将后续请求缓存;待刷新 Token 接口返回后,使用新的 token 请求缓存的请求。
错误清除 token
错误退出登录
格式化返回格式格式化返回格式
提供请求处理钩子
请求之前处理配置: beforeRequestHook
请求成功处理: transformRequestData
请求失败处理: requestCatch
请求之前的拦截器: requestInterceptors
请求之后的拦截器: responseInterceptors
请求之前的拦截器错误处理: requestInterceptorsCatch
请求之后的拦截器错误处理: responseInterceptorsCatch

默认状态码检查:

状态码提示文案操作
400默认错误,返回服务端返回消息提示
401用户没有权限(令牌、用户名、密码错误)!
403用户得到授权,但是访问是被禁止的!
404网络请求错误,未找到该资源!
405网络请求错误,请求方法未允许!
408网络请求超时!
500服务器错误,请联系管理员!
501网络未实现!
502网络错误!
503服务不可用,服务器暂时过载或维护!
504网络超时!
505http版本不支持该请求!

安装

可以引入 sewen-ui 库

npm install sewen-ui

也可以直接单独使用 xhttp 库

npm install xhttp

使用

TypeScript

引入 xhttp 库:

import { createXhttp } from 'sewen-ui/xhttp'

export default createXhttp({
    tokenKey: 'test-token', // token key值,传入token key值,默认使用内部获取方法
    tokenExpires: 1, // token 过期时间
    storageType: 'cookie', // 存储token 方法
    addAjaxErrorInfo: (error) => {
        console.log("🚀 ==========错误日志收集方法===========", error)
    },
    getToken: () => {
        console.log('==============获取本地token 方法============')
        return '1234567890'
    },
    logout: () => {
        console.log('==============logout 退出登录方法============')
    },
    statusMap: {
        400: {
            msg: '400状态码',
            callback: () => {
                console.log('=============400状态码相关处理函数===============')
            },
        },
        401: {
            msg: '401状态码',
            callback: () => {
                console.log('=============401状态码相关处理函数===============')
            },
        },
        402: {
            msg: '402状态码',
            callback: () => {
                console.log('=============402状态码相关处理函数===============')
            },
        },
        404: {
            msg: '404状态码',
            callback: () => {
                console.log('=============404状态码相关处理函数===============')
            },
        },
        500: {
            msg: '500状态码',
            callback: () => {
                console.log('=============404状态码相关处理函数===============')
            },
        }
    }
},
    {
        requestOptions: {
            urlPrefix: 'api'
        }
    });

使用 xhttp 库:

import defHttp from '@/packages/http/index'

interface AccountInfoModel {
    email: string;
    name: string;
    introduction: string;
    phone: string;
    address: string;
}

export function setAccountInfo(params: AccountInfoModel) {
    return defHttp.post<AccountInfoModel>(
        {
            url: '/acount/post',
            params,
        },
        {
            errorMessageMode: 'modal',
        },
    );
}

export function getAccountInfo(params: AccountInfoModel) {
    return defHttp.get(
        {
            url: '/acount/get',
            params
        },
        {
            successMessageMode: 'message',
            errorMessageMode: 'message',
        },
    );
}

请求参数

方法参数参数可选值说明
get(options,msgOpt)optionsaxios 请求参数
msgOpterrorMessageMode、successMessageMode消息类型参数
msgOpt.errorMessageModemodal、message、none错误消息提示
msgOpt.successMessageModemodal、message、none成功消息提示

响应数据

默认服务端返回默认为以下数据格式:

{
    'code': 0, // 0 表示成功,-1 表示失败
    'message': '返回消息',
    'result': {} // 响应结构
    }
}

如果服务端返回接口无法返回以上固定格式,则需要在 createXhttp 第一个参数传入 formatResponse 方法,对返回的数据格式进行格式化。

如服务端返回如下格式:

{
    "Code": 200, // 状态码
    "Msg": "OK", // 提示信息
    "Data": {} // 数据
}

则在创建 http 实例时,配置如下:

import { createXhttp } from 'sewen-ui/xhttp'

export default createXhttp({
    tokenKey: 'test-token', // token key值,传入token key值,默认使用内部获取方法
    tokenExpires: 1, // token 过期时间
    formatResponse: (data)=> {//参数 formatResponse 方法,对返回的数据格式进行格式化。
        return { // 将服务端返回的数据格式化
            code: data.Code,
            message: data.Msg,
            result: data.Data
        }
    } , // 存储token 方法
},
{
    requestOptions: {
        urlPrefix: 'api'
    }
});

默认配置参数

createXhttp(transformOpt: transformOptType, axiosOpt: Partial<CreateAxiosOptions>) 方法参数

transformOpt 参数

参数功能类型默认值
Message(可选)消息提示组件Function
Modal(可选)模态弹窗提示组件Function
tokenKey(可选)登录 token Key 值stringBearer
tokenExpires(可选)登录 token 过期时间number7 天
storageType(可选)token 存储类型localStoragesessionStoragecookielocalStorage
getToken(可选)获取 token 方法Function
setToken(可选)设置 token 方法Function
logout(可选)退出登录方法Function
addAjaxErrorInfo(可选)添加 ajax 错误日志方法Function
statusMap(可选)状态码和处理方法 map 对象 Record<number, any>
refreshTokenConfig(可选)刷新 token 相关配置refreshTokenType默认为空,不自动刷新 Token
authorizationKeytoken 验证 key 值stringAuthorization

refreshTokenConfig 参数

refreshTokenConfig 默认为空,不刷新 Token,传入 refreshTokenConfig 相关配置后,根据传入 token 过期时间和时间间隔,在每次请求之前自动判断当前时间与 token 过期时间差小于指定刷新间隔时间,如果是,自动请求刷新 Token 接口刷新 Token,并将后续请求缓存;待刷新 Token 接口返回后,使用新的 token 请求缓存的请求。

refreshTokenConfig 相关配置:

参数类型说明
url (必填)string刷新 token url
interval (必填)numbertoken 刷新间隔(单位为毫秒)
expires(选填)numbertoken 过期时间(单位为毫秒)
tokenExpiresKey(必填)stringtoken 过期时间本地存储的 key,如果没有传入expires,则自动从本地通过 tokenExpiresKey 获取 token 过期时间
refreshIdKey(选填)stringtoken 刷新id 本地存储的 key,如果没有 传入 refreshIdKey,则在刷新 token 时不会向后端传递 refreshId 参数
refreshId(选填)stringtoken 刷新id,如果不传,则不会向刷新 token 接口传入该参数
params(选填)object刷新 token 接口额外参数

刷新 token 配置使用方法:

  1. 创建登录 xHttp 请求:
import { createXhttp } from 'sewen-ui/xhttp'

export default createXhttp({
    tokenKey: 'test-token', // token key值,传入token key值,默认使用内部获取方法
    tokenExpires: 1, // token 过期时间
    storageType: 'cookie', // 存储token 方法
    refreshTokenConfig: { // token 自动刷新配置
        url: '/refresh-token', // 刷新 token url
        interval: 20 * 60 * 1000, // token 刷新时间间隔为 20 分钟
        tokenExpiresKey: 'test-tokenExpiresKey', // token 过期时间存储 key
        refreshIdKey: 'test-refreshIdKey', // 存储 refreshId 刷新 token id 的 key, 选填,不传入则不会向刷新token 接口中传入 refreshId 参数
       // expires: null, // 登录请求接口中,token 过期时间为空
       // refreshId: null, // 登录请求接口中,refreshId 刷新 token id 为空
      
    },
    addAjaxErrorInfo: (error) => {
        console.log("🚀 ==========错误日志收集方法===========", error)
    },

    logout: () => {
        console.log('==============logout 退出登录方法============')
    }
},
    {
        requestOptions: {
            urlPrefix: 'api'
        }
    });
  1. 定义登录和刷新 token 方法:
import xHttp from '@/packages/http/index'

interface loginModel {
    name: string; // 用户名
    password: string; // 密码
}

interface tokenRefreshModel {
    expire: string; // token 过期时间
    token: string; // token
    refreshId: string; // 刷新token id
}

export function login(params: loginModel) {
    return xHttp.post<loginModel>(
        {
            url: '/login',
            params,
        },
        {
            errorMessageMode: 'modal',
        },
    );
}

export function refreshToken(params: tokenRefreshModel) {
    return xHttp.get(
        {
            url: '/refresh-token',
            params
        },
        {
            successMessageMode: 'message',
            errorMessageMode: 'message',
        },
    );
}

3.使用 Http 登录请求获取 token 并存储 token、token 过期时间和刷新 token id,并存入本地:

import { login } from '你的api路径/login'
import Cookies from 'js-cookie'

const {
    expire, // token 过期时间
    token, // token
    refreshId,// 刷新token id
} = await login()

// 存储 token, 注意存储的 token key和存储方案需要在 createXhttp 参数相同!
Cookies.set('test-token', token);
//存储 token 过期时间,注意存储的 token 过期时间和存储方案需要在 createXhttp 参数相同!
Cookies.set('test-tokenExpiresKey', expire);
// 存储刷新 token id,注意存储的刷新 token id 和存储方案需要在 createXhttp 参数相同!
Cookies.set('test-refreshIdKey', refreshId);

刷新 token 接口说明

刷新 token 接口默认为 post 请求,返回接口格式默认如下:

 {
 'code': 0,
 'message': '刷新 token 消息提示',
 'result': {
     'token': `刷新后的 token`,
     'expires': '刷新后的过期时间,默认接收时间戳'
  }
}

axiosOpt 参数

参数功能类型默认值
axios 配置
authenticationSchemeHTTP 验证authentication schemes,e.g: Bearer
authenticationScheme: 'Bearer',
timeout接口超时等待时间10 * 1000
headershttp 头参数{ 'Content-Type': ContentTypeEnum.JSON }
如果是form-data格式:
{ 'Content-Type': ContentTypeEnum.FORM_URLENCODED }
transform数据处理方式
requestOptions请求选项
requestOptions.joinPrefix是否将 prefix 添加到urltrue
requestOptions.isReturnNativeResponse是否返回原生响应头 比如:需要获取响应头时使用该属性false
requestOptions.isTransformResponse需要对返回数据进行处理true
requestOptions.joinParamsToUrlpost请求的时候添加参数到 urlfalse
requestOptions.formatDate格式化提交参数时间true
requestOptions.errorMessageMode消息提示组件message(可选参数:
none 或 modal 或message)
requestOptions.apiUrl接口地址''
requestOptions.urlPrefix接口拼接地址''
requestOptions.joinTime是否加入时间戳true
requestOptions.ignoreCancelToken忽略重复请求true
requestOptions.withToken是否携带tokentrue
requestOptions.retryRequest请求重试配置
requestOptions.retryRequest.isOpenRetry是否开启请求重试true
requestOptions.retryRequest.count请求重试次数5
requestOptions.retryRequest.waitTime请求重试等待时间100

贡献者

sewen-ui design by Sewen