Files

153 lines
3.8 KiB
TypeScript
Raw Normal View History

2023-08-30 17:27:21 +08:00
import Message from "tdesign-miniprogram/message/index";
import { setToken } from "./settings";
const authWhitelist = ["/mini-app/login"];
interface RequestOption {
url: string;
method?: "POST" | "PUT" | "DELETE" | "OPTIONS" | "HEAD" | "TRACE" | "CONNECT";
data?: any;
params?: object;
header?: object;
}
interface RequestConfig {
baseUrl: string;
timeout?: number;
}
const buildQueryString = (params: object) => {
const queryParams = [];
for (const key in params) {
if (params.hasOwnProperty(key)) {
// @ts-ignore
const value = encodeURIComponent(params[key]);
queryParams.push(`${encodeURIComponent(key)}=${value}`);
}
}
return `?${queryParams.join("&")}`;
};
class HttpClient {
baseUrl: string;
constructor(config: RequestConfig) {
this.baseUrl = config.baseUrl;
}
request(req: RequestOption) {
let url: string;
let paramsString = "";
if (req.params) {
paramsString = buildQueryString(req.params);
}
if (req.url.startsWith("https://") || req.url.startsWith("http://")) {
url = req.url;
} else {
url = `${this.baseUrl}${req.url}${paramsString}`;
}
const app = getApp();
2023-08-31 16:24:37 +08:00
2023-08-30 17:27:21 +08:00
const header: any = req.header ?? {};
2023-08-31 16:24:37 +08:00
if (!authWhitelist.includes(req.url) && !header.Authorization) {
header.Authorization = `Bearer ${app?.globalData?.authToken}`;
2023-08-30 17:27:21 +08:00
}
return new Promise(function (resolve, reject) {
wx.request({
url,
method: req.method,
data: req.data,
header,
success(response) {
let respData: any = response.data;
let statusCode = respData.code;
if (statusCode == 200) {
resolve(respData);
} else {
Message.error({
offset: [20, 32],
duration: 5000,
content: respData.msg,
});
if (statusCode == 401) {
// TODO: remove token & redirect to login
setToken(undefined);
wx.switchTab({
url: "/pages/login/login",
});
}
reject(response.data);
}
},
fail(error) {
Message.error({
offset: [20, 32],
duration: 5000,
content: error.errMsg,
});
reject(error);
},
});
});
}
uploadFile(req: any) {
let url: string;
const app = getApp();
if (req.url.startsWith("https://") || req.url.startsWith("http://")) {
url = req.url;
} else {
url = `${this.baseUrl}${req.url}`;
}
return new Promise((resolve, reject) => {
wx.uploadFile({
url,
filePath: req.file.url,
name: "file",
header: {
Authorization: `Bearer ${app.globalData.authToken}`,
},
success(response) {
let respData: any;
if (typeof response.data === "string") {
try {
respData = JSON.parse(response.data);
} catch {
respData = {};
}
} else {
respData = response.data;
}
let statusCode = respData.code;
if (statusCode == 200) {
resolve(respData);
} else {
Message.error({
offset: [20, 32],
duration: 5000,
content: respData.msg,
});
reject(respData);
}
},
fail: (error) => {
Message.error({
offset: [20, 32],
duration: 5000,
content: error.errMsg,
});
reject(error);
},
});
});
}
}
export const httpClient = new HttpClient({
baseUrl: "https://nine.motse.com.cn/api",
// baseUrl: "http://192.168.0.200:8080",
});
export default httpClient;