|
|
import apiConfig from "./apiConfig";
|
|
|
|
|
|
export class Session{
|
|
|
cookies = ""
|
|
|
constructor(name="__default__"){
|
|
|
this.name = name;
|
|
|
this.cookie_key = "COOKIES-" + name;
|
|
|
}
|
|
|
saveCookies(){
|
|
|
wx.setStorage({
|
|
|
key: this.cookie_key,
|
|
|
data: this.cookies,
|
|
|
})
|
|
|
}
|
|
|
loadCookies(){
|
|
|
this.cookies = wx.getStorageSync(this.cookie_key);
|
|
|
}
|
|
|
setCookies(cookies){
|
|
|
this.cookies = cookies.map(item => item.split(";")[0]).join("; ");
|
|
|
}
|
|
|
splitCookies(string){
|
|
|
let cookies = string.split(/,\s?(?=[^=,\;]*?\=)/ig);
|
|
|
return cookies;
|
|
|
}
|
|
|
request({ url, header, success,...options}) {
|
|
|
//console.log(this);
|
|
|
//console.log("request cookir", {...header, "Cookie": this.cookies});
|
|
|
return wx.request({
|
|
|
...options,
|
|
|
url,
|
|
|
header: {...header, "Cookie": this.cookies},
|
|
|
success: (res) => {
|
|
|
console.debug("request success", res);
|
|
|
if (res.cookies && res.cookies.length>0)
|
|
|
this.setCookies(res.cookies);
|
|
|
else if (res.header["Set-Cookie"])
|
|
|
this.setCookies(this.splitCookies(res.header["Set-Cookie"]));
|
|
|
else if(res.header["set-cookie"])
|
|
|
this.setCookies(this.splitCookies(res.header["set-Cookie"]));
|
|
|
success(res);
|
|
|
if(url.indexOf("login.json")!=-1&&!res.data.status&&!this.cookies){
|
|
|
wx.reportMonitor("0", 2);
|
|
|
global.realTimeLog.error(res, "login fail: fail parse cookies!!", res);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
uploadFile({url, filePath, name, header, formData, success, fail, complete}){
|
|
|
return wx.uploadFile({
|
|
|
url,
|
|
|
filePath,
|
|
|
name,
|
|
|
header: {"Cookie": this.cookies, ...header},
|
|
|
formData,
|
|
|
success:res=>{
|
|
|
try{
|
|
|
res.data = JSON.parse(res.data);
|
|
|
}catch(e){
|
|
|
//@todo
|
|
|
}
|
|
|
;
|
|
|
if(success)
|
|
|
success(res)
|
|
|
},
|
|
|
fail,
|
|
|
complete
|
|
|
})
|
|
|
}
|
|
|
downloadFile({url, header, filePath, success, fail, complete}){
|
|
|
return wx.downloadFile({
|
|
|
url,
|
|
|
header: {...header, "Cookie": this.cookies},
|
|
|
filePath,
|
|
|
success,
|
|
|
fail,
|
|
|
complete
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
function handler({success, fail, complete, resolve, reject}){
|
|
|
return {
|
|
|
success: res => {
|
|
|
if (res.data.status && res.data.status > 100 || res.data.status<0) {
|
|
|
switch (res.data.status) {
|
|
|
case 401:
|
|
|
var message = "(●'◡'●)\n请先登录哦";
|
|
|
var code = res.data.status;
|
|
|
break;
|
|
|
default:
|
|
|
var message = res.data.message;
|
|
|
var code = res.data.status;
|
|
|
}
|
|
|
let e = new Error(message);
|
|
|
e.code = code;
|
|
|
if (fail) fail(e, res.data);
|
|
|
reject(e, res.data);
|
|
|
return complete&&complete(e, res.data);
|
|
|
}
|
|
|
success&&success(res.data);
|
|
|
resolve(res.data);
|
|
|
complete&&complete(res.data);
|
|
|
},
|
|
|
fail: e => {
|
|
|
if ("errMsg" in e)
|
|
|
(e = new Error("(⋟﹏⋞)\n网络连接失败了")).code = -2;
|
|
|
if (!("message" in e))
|
|
|
(e = new Error("哎呀,出错了\n(>_<)")).code = -1;
|
|
|
fail&& fail(e, {});
|
|
|
reject(e, {});
|
|
|
complete&&complete(e, {});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
export function triggerApi({session, name, data:_data = {}, success, fail, complete, config:{method,header={}}={}}) {
|
|
|
let api = apiConfig;
|
|
|
for (var key of name.split(".")) api=api[key];
|
|
|
let { url, query={}, form = {}, config:{method:_method,_header={},...config}={}} = api;
|
|
|
method = method || _method;
|
|
|
if(url){
|
|
|
if(url._)
|
|
|
url = url[method||"GET"]||url._;
|
|
|
url = name.replace(/\.?[^\.]+$|\./g, "/") + url.replace(/\{(.*?)\}/g, function (match, k) {
|
|
|
return _data[k];
|
|
|
}).replace(/\*/g,key);
|
|
|
}else
|
|
|
url = name.replace(/\./g, "/");
|
|
|
url = global.config.apiRoot + url + ".json";
|
|
|
header = {..._header,...header};
|
|
|
var data={},param={};
|
|
|
if(form._)
|
|
|
form={...form._,...form[method||"GET"]};
|
|
|
if(query._)
|
|
|
query={...query._,...query[method||"GET"]};
|
|
|
for(var key in form){
|
|
|
if(key in _data)
|
|
|
data[key]=_data[key];
|
|
|
else{
|
|
|
let value = form[key];
|
|
|
if (value!=null)
|
|
|
data[key] = value;
|
|
|
else if (typeof value == "object")
|
|
|
console.error(`${key} was not given in data`, _data);
|
|
|
}
|
|
|
}
|
|
|
for(var key in query){
|
|
|
if (key in _data)
|
|
|
param[key] = _data[key];
|
|
|
else {
|
|
|
let value = query[key];
|
|
|
if (value!=null)
|
|
|
param[key] = value;
|
|
|
else if (typeof value == "object")
|
|
|
console.error(`${key} was not given in data`, _data);
|
|
|
}
|
|
|
}
|
|
|
let queryStr = Object.keys(param).map(key => `${key}=${param[key]}`).join("&");
|
|
|
if(queryStr)
|
|
|
url = url+"?"+queryStr;
|
|
|
if(method=="uploadFile"){
|
|
|
|
|
|
var formData = data;
|
|
|
var {name:_name, timeout} = config;
|
|
|
if(!_name)
|
|
|
_name = Object.keys(formData)[0];
|
|
|
var filePath = formData[_name];
|
|
|
delete formData[_name];
|
|
|
return new Promise((resolve, reject)=>{
|
|
|
session.uploadFile({
|
|
|
url, filePath, name:_name, header, timeout, formData, ...handler({success, fail, complete, resolve, reject})
|
|
|
})
|
|
|
});
|
|
|
}else if(method=="downloadFile"){
|
|
|
return new Promise((resolve,reject)=>{
|
|
|
session.downloadFile({
|
|
|
url, header, success:res=>{
|
|
|
resolve(res);
|
|
|
success&&success(res);
|
|
|
}, fail:e=>{
|
|
|
reject(e);
|
|
|
fail&&fail(e)
|
|
|
},complete
|
|
|
})
|
|
|
})
|
|
|
}else
|
|
|
return new Promise((resolve, reject) => {
|
|
|
session.request({
|
|
|
url, method, data, header,...handler({success, fail, complete, resolve, reject})
|
|
|
});
|
|
|
})
|
|
|
}
|