Taro request 请求封装
在根目录下创建service文件夹
再创建 baseUrl文件 写入请求地址
const getBaseUrl = (url) => {
let BASE_URL = '';
if (process.env.NODE_ENV === 'development') {
//开发环境 - 根据请求不同返回不同的BASE_URL
BASE_URL = 'https://*********'
} else {
// 生产环境
BASE_URL = 'https://*********'
}
return BASE_URL
}
export default getBaseUrl;
创建config.js文件写入常用状态码
export const HTTP_STATUS = {
SUCCESS: 200,
CREATED: 201,
ACCEPTED: 202,
CLIENT_ERROR: 400,
AUTHENTICATE: 401,
FORBIDDEN: 403,
NOT_FOUND: 404,
SERVER_ERROR: 500,
BAD_GATEWAY: 502,
SERVICE_UNAVAILABLE: 503,
GATEWAY_TIMEOUT: 504
}
创建http文件写入逻辑
import Taro from '@tarojs/taro'
import getBaseUrl from './baseUrl'
import interceptors from './interceptors'
interceptors.forEach(interceptorItem => Taro.addInterceptor(interceptorItem))
class httpRequest {
baseOptions(params, method = "GET") {
let { url, data,param } = params;
const BASE_URL = getBaseUrl(url);
// let contentType = "application/x-www-form-urlencoded";
let contentType = "application/json;charset=UTF-8";
contentType = params.contentType || contentType;
const option = {
url: BASE_URL + url, //地址
data: data, //传参
method: method, //请求方式
timeout:50000, // 超时时间
header: { //请求头
'content-type': contentType,
'Authorization':Taro.getStorageSync('Authorization')
}
};
return Taro.request(option);
}
get(url, data = "",param) {
let option = { url, data,param };
return this.baseOptions(option);
}
post(url, data,param, contentType) {
let params = { url, data,param, contentType };
return this.baseOptions(params, "POST");
}
put(url, data = "") {
let option = { url, data };
return this.baseOptions(option, "PUT");
}
delete(url, data = "") {
let option = { url, data };
return this.baseOptions(option, "DELETE");
}
}
export default new httpRequest()
再创建interceptors文件 写入异常显示逻辑
import Taro from "@tarojs/taro"
import { pageToLogin } from "./utils"
import { HTTP_STATUS } from './config'
const customInterceptor = (chain) => {
const requestParams = chain.requestParams
Taro.showLoading({
title: '加载中',
})
return chain.proceed(requestParams).then(res => {
Taro.hideLoading()
// 只要请求成功,不管返回什么状态码,都走这个回调
if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
return Promise.reject({ desc: '请求资源不存在' })
} else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
return Promise.reject({ desc: "服务端出现了问题" })
} else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
Taro.setStorageSync("Authorization", "")
pageToLogin()
// TODO 根据自身业务修改
return Promise.reject({ desc: "没有权限访问" });
} else if (res.statusCode === HTTP_STATUS.AUTHENTICATE) {
Taro.setStorageSync("Authorization", "")
pageToLogin()
return Promise.reject({ desc: "需要鉴权" })
} else if (res.statusCode === HTTP_STATUS.SERVER_ERROR) {
return Promise.reject({ desc: "服务器错误" });
} else if (res.statusCode === HTTP_STATUS.SUCCESS) {
if (res.data.code === 0) {
return res.data
} else if (res.data.code == '-100') {
//非法登录
pageToLogin()
}
else {
return Promise.reject(res.data)
}
}
}).catch(error=> {
Taro.hideLoading()
console.error(error)
return Promise.reject(error)
})
}
// Taro 提供了两个内置拦截器
// logInterceptor - 用于打印请求的相关信息
// timeoutInterceptor - 在请求超时时抛出错误。
// const interceptors = [customInterceptor, Taro.interceptors.logInterceptor]
const interceptors = [customInterceptor]
export default interceptors
创建utils文件 写入处理异常状态方法
import Taro from "@tarojs/taro";
/**
* @description 获取当前页url
*/
export const getCurrentPageUrl = () => {
let pages = Taro.getCurrentPages()
let currentPage = pages[pages.length - 1]
let url = currentPage.route
return url
}
export const pageToLogin = () => {
let path = getCurrentPageUrl()
Taro.clearStorage()
if (!path.includes('login')) {
Taro.reLaunch({
url: "/pages/login/login"
});
}
}
最后创建 servers文件进行api注册
import HTTPREQUEST from "./http"
export const getLogin = (data) => {
return HTTPREQUEST.post('/api/login/login', data)
}
最后在页面引入就可以了