当前位置: 首页 > news >正文

什么是工具型网站新东方托福班价目表

什么是工具型网站,新东方托福班价目表,网站建设交流群,下载吧网站整站源码目录 前后端交互约定安装创建Axios实例拦截器封装请求方法业务异常处理 axios 是一个易用、简洁且高效的http库 axios 中文文档:http://www.axios-js.com/zh-cn/docs/ 前后端交互约定 在本项目中,前后端交互统一使用 application/json;charsetUTF-8 的请…

目录

    • 前后端交互约定
    • 安装
    • 创建Axios实例
    • 拦截器
    • 封装请求方法
    • 业务异常处理


在这里插入图片描述

axios 是一个易用、简洁且高效的http库
axios 中文文档:http://www.axios-js.com/zh-cn/docs/


前后端交互约定

在本项目中,前后端交互统一使用 application/json;charset=UTF-8 的请求方式,后端返回对象统一为如下格式

export interface ResponseBody<T = any> {status: boolean,	// 业务处理状态,true表示正常,false表示异常code: string		// 业务处理状态码message: string,	// 提示信息data?: T			// 业务处理返回数据
}

安装

yarn add axios

创建Axios实例

src 目录下创建 http 目录,http 请求相关的文件都放置于该目录

创建 axios.ts 文件,用于定义 axios

// axios.ts
const instance: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 60000,headers: { 'Content-Type': 'application/json;charset=UTF-8' },
})

其中,import.meta.env.VITE_APP_BASE_API.env 中配置的环境变量,不同环境使用不同的请求地址

拦截器

通过 instance.interceptors.request.use 实现前置拦截器,发起请求前执行,用于对请求对象进行加工处理。

下面这段代码主要做的事情就是将 token 设置到请求头中。

// axios.ts
async function requestHandler(config: InternalAxiosRequestConfig & RequestConfigExtra): Promise<InternalAxiosRequestConfig> {if (config.modulePrefix) {config.url = config.modulePrefix + config.url}const token = useAuthorization()if (token.value && config.token !== false) {config.headers.set("Authorization", token.value)}console.log("execute http request:" + config.url)return config
}instance.interceptors.request.use(requestHandler)

RequestConfigExtra 为自定义参数,在本项目中定义如下,可根据需要自行扩展。

export interface RequestConfigExtra {// 模块前缀modulePrefix?: string,// 发起请求时,是否需要在请求头中附加 tokentoken?: boolean,// 成功处理函数,默认为 false,如果为 false,则什么都不做,如果为 true,则自动提示成功信息,如果为 Function,则自定义处理结果success?: boolean | ((response: ResponseBody<any>) => void),// 失败处理函数,默认为 true,如果为 false,则什么都不做,如果为 true,则自动提示失败信息,如果为 Function,则自定义处理结果error?: boolean | ((response: ResponseBody<any>) => void),
}

通过 instance.interceptors.response.use 实现后置拦截器,对后端返回数据进行处理。

function responseHandler(response: any): ResponseBody<any> | AxiosResponse<any> | Promise<any> | any {return response.data
}function errorHandler(errorInfo: AxiosError): Promise<any> {if (errorInfo.response) {const { data, status, statusText } = errorInfo.response as AxiosResponse<ResponseBody>if (status === 401) {const token = useAuthorization()token.value = nullmessage.error(data?.message || statusText)router.push({path: '/login', query: { redirect: router.currentRoute.value.fullPath}})} else {message.error(data?.message || statusText)} }return Promise.reject(errorInfo)
}instance.interceptors.response.use(responseHandler, errorHandler)

errorHandler 方法对系统异常进行了统一处理,如果后端返回的 status 不是 200,则会执行该处理方法,如果返回 401,表示没有通过登录鉴权,自动跳转登录页,如果是其它异常码,则提示错误信息。

封装请求方法

这里对 restful 常用的四种请求方式进行进一步的封装

// axios.ts
function instancePromise<R = any, T = any>(options: AxiosRequestConfig<T> & RequestConfigExtra): Promise<ResponseBody<R>> {return new Promise((resolve, reject) => {instance.request<any, ResponseBody<R>>(options).then((res) => {try {resolve(responseBodyHandle(res, options))} catch (err) {reject(err || new Error('response handle error!'))}}).catch((e: Error | AxiosError) => {reject(e)})})
}export function doGet<R = any, T = any>(url: string, params?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,params,method: RequestEnum.GET,...config,}return instancePromise<R, T>(options)
}export function doPost<R = any, T = any>(url: string, data?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,data,method: RequestEnum.POST,...config,}return instancePromise<R, T>(options)
}export function doPut<R = any, T = any>(url: string, data?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,data,method: RequestEnum.PUT,...config,}return instancePromise<R, T>(options)
}export function doDelete<R = any, T = any>(url: string, data?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,data,method: RequestEnum.DELETE,...config,}return instancePromise<R, T>(options)
}

业务异常处理

在拦截器中,我们对系统异常进行了统一处理,在实际项目中,更多的情况是前端请求没有通过后端的业务校验,后端返回错误信息,前端进行提示。

创建一个业务异常类

export class ResponseBodyError extends Error {code: stringmessage: stringcause: anyconstructor({ code, message, cause }: { code: string, message: string, cause?: any }) {super();this.code = code;this.message = message;this.cause = cause}
}

实现业务异常统一处理,通过在请求时定义 RequestConfigExtra 中的参数来实现对后端返回结果的提示。

比如:查询请求,设置为 {success:false, error: true},如果请求失败,提示错误信息,如果请求成功,不作处理。业务请求,设置为 {success: true, error: true},如果请求失败,提示错误信息,如果处理成功,提示操作成功。

function responseBodyHandle<R = any, T = any>(response: ResponseBody<R>, options: AxiosRequestConfig<T> & RequestConfigExtra): any {const { status, message:msg, code, data } = responseconst { success, error } = optionsif (status === true) {if (success === true) {message.success(msg ?? "操作成功")} else if (isFunction(success)) {success(response)}return response} else {if (isFunction(error)) {error(response)} else if (error !== false) {message.error(msg ?? "操作失败")}throw new ResponseBodyError({ code, msg })}
}

完整代码如下:

// axios.ts
/*** 创建 Axios 实例*/
const instance: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 60000,headers: { 'Content-Type': 'application/json;charset=UTF-8' },
})/*** 前置拦截器*/
async function requestHandler(config: InternalAxiosRequestConfig & RequestConfigExtra): Promise<InternalAxiosRequestConfig> {if (config.modulePrefix) {config.url = config.modulePrefix + config.url}const token = useAuthorization()if (token.value && config.token !== false) {config.headers.set(authorizationHeader, authorizationValue())}console.log("execute http request:" + config.url)return config
}/*** 后置拦截器*/
function responseHandler(response: any): ResponseBody<any> | AxiosResponse<any> | Promise<any> | any {return response.data
}/*** 系统异常统一处理函数*/
function errorHandler(errorInfo: AxiosError): Promise<any> {if (errorInfo.response) {const { data, status, statusText } = errorInfo.response as AxiosResponse<ResponseBody>if (status === 401) {const token = useAuthorization()token.value = nullmessage.error(data?.message || statusText)router.push({path: '/login', query: { redirect: router.currentRoute.value.fullPath}})} else {message.error(data?.message || statusText)} }return Promise.reject(errorInfo)
}instance.interceptors.request.use(requestHandler)
instance.interceptors.response.use(responseHandler, errorHandler)/*** 业务异常统一处理函数*/
function responseBodyHandle<R = any, T = any>(response: ResponseBody<R>, options: AxiosRequestConfig<T> & RequestConfigExtra): any {const { status, message:msg, code, data } = responseconst { success, error } = optionsif (status === true) {if (success === true) {message.success(msg ?? "操作成功")} else if (isFunction(success)) {success(response)}return response} else {if (isFunction(error)) {error(response)} else if (error !== false) {message.error(msg ?? "操作失败")}throw new ResponseBodyError({ code, msg })}
}function instancePromise<R = any, T = any>(options: AxiosRequestConfig<T> & RequestConfigExtra): Promise<ResponseBody<R>> {return new Promise((resolve, reject) => {instance.request<any, ResponseBody<R>>(options).then((res) => {try {resolve(responseBodyHandle(res, options))} catch (err) {reject(err || new Error('response handle error!'))}}).catch((e: Error | AxiosError) => {reject(e)})})
}export function doGet<R = any, T = any>(url: string, params?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,params,method: RequestEnum.GET,...config,}return instancePromise<R, T>(options)
}export function doPost<R = any, T = any>(url: string, data?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,data,method: RequestEnum.POST,...config,}return instancePromise<R, T>(options)
}export function doPut<R = any, T = any>(url: string, data?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,data,method: RequestEnum.PUT,...config,}return instancePromise<R, T>(options)
}export function doDelete<R = any, T = any>(url: string, data?: T, config?: AxiosRequestConfig & RequestConfigExtra): Promise<ResponseBody<R>> {const options = {url,data,method: RequestEnum.DELETE,...config,}return instancePromise<R, T>(options)
}
http://www.mnyf.cn/news/45206.html

相关文章:

  • 网站建设的费用和预算谷歌广告代理商
  • 做三级分销商城网站设计竞彩足球最新比赛
  • 企业网站百度指数多少算竞争大商丘网站seo
  • wordpress 评论贴图优化大师安卓版
  • 宁波电器网站制作seo的优化步骤
  • 网站的可视化设计百度seo公司兴田德润
  • 备案增加网站品牌营销策略四种类型
  • 基于php网站开发设计市场推广seo职位描述
  • 做公司网站是永久性的吗国外域名注册平台
  • 建设银行如何设置网站查询密码seo推广seo技术培训
  • 优秀网站设计 打造有吸引力的网站全网络品牌推广
  • 临淄房产信息网株洲seo优化推荐
  • 群晖修改wordpress端口南宁哪里有seo推广厂家
  • 哪些网站可以做调查问卷新产品推广
  • 项目管理流程软件长沙网站seo
  • php做网站视频播放下载功能百度加盟
  • 做lgoo的网站一般有哪些重庆网站快速排名优化
  • p2p贷款网站制作网站关键词排名软件推荐
  • 深圳企业官网网站建设哪家好企业网站设计与实现论文
  • 金堂做网站的公司高明公司搜索seo
  • 做网站膜网站怎么做公司网站设计与制作
  • 四川城乡建设网站证件查询网络推广公司可不可靠
  • 网站建设开封软件制作百度推广运营专员
  • 做刷网站网络营销策划案例
  • 做有网被视频网站吗网站seo优化外包顾问
  • 网站建设小程序开发搜索引擎网站入口
  • 擅自给公司做网站有什么责任iis搭建网站
  • 手机版网站开发的功能点seo关键词排名优化品牌
  • 手机做任务赚钱网站广州网站优化排名系统
  • 个体工商户可以做网站备案吗域名注册阿里云