icemilk
Version:
Shanghai jinbaozheng easy network technology Co.,Ltd sdk
165 lines (149 loc) • 7.85 kB
text/typescript
import {AxiosRequestConfig, AxiosResponse} from "axios";
import JRequester from "./JRequester";
import CancelPromiseFactory from "../factory/CancelPromiseFactory";
import {jgetGlobalValue} from './JNetworkFunc';
import INetworkDelegate from "../interface/INetworkDelegate";
import JNetworkError from './JNetworkError';
import JRequestEngine from '../util/JRequestEngine';
import INetworkFetch from "../interface/INetworkFetch";
import INetworkExtra from "../interface/INetworkExtra";
import {INetworkStandardPromiseType} from "../../types";
import JNetworkRoot from "./JNetworkRoot";
import JNetwork from "./JNetwork";
import JToolObject from "../tool/JToolObject";
let GROUP_COUNT = 0
export default class JNetworkGroup extends JNetworkRoot implements INetworkFetch, INetworkExtra{
readonly baseUrl: string;
readonly freezeCarryParams: object;
readonly freezeCarryHeaders: object;
readonly freezeCarryBodyData: object;
readonly axiosConfig: AxiosRequestConfig;
readonly delegate: INetworkDelegate;
readonly groupId: number;
readonly isSync: boolean;
readonly parent: JNetwork;
private readonly freezeParams:Array<string|object>;
private readonly freezeHeaders:Array<string|object>;
private readonly freezeBodyData:Array<string|object>;
private readonly requestEngine:JRequestEngine = new JRequestEngine();
constructor(baseUrl: string, axiosConfig: AxiosRequestConfig, delegate: INetworkDelegate, options?:any){
super();
this.baseUrl = baseUrl;
this.axiosConfig = axiosConfig || {};
this.delegate = delegate || null;
this.groupId = ++GROUP_COUNT;
if (options){
this.freezeParams = options.freezeParams || [];
this.freezeHeaders = options.freezeHeaders || [];
this.freezeBodyData = options.freezeBodyData || [];
this.freezeCarryParams = options.freezeCarryParams || {};
this.freezeCarryHeaders = options.freezeCarryHeaders || {};
this.freezeCarryBodyData = options.freezeCarryBodyData || {};
this.isSync = options.isSync;
this.parent = options.parent;
}
}
public pickInjectParams(): object{
return {
...JToolObject.getObjOrFuncResult(this.freezeCarryParams),
...jgetGlobalValue([...this.freezeParams, ...this.extraParams], this.delegate, _ => _.globalParams)
}
}
public pickInjectHeaders(): object{
return {
...JToolObject.getObjOrFuncResult(this.freezeCarryHeaders),
...jgetGlobalValue([...this.freezeHeaders, ...this.extraHeaders], this.delegate, _ => _.globalHeaders)
}
}
public pickInjectBodyData(): object{
return {
...JToolObject.getObjOrFuncResult(this.freezeCarryBodyData),
...jgetGlobalValue([...this.freezeBodyData, ...this.extraBodyData], this.delegate, _ => _.globalBodyData)
}
}
/**
* 发送请求
* @param method 方法类型
* @param baseUrl 基地址
* @param url 相对地址
* @param parameters 参数
* @param data data参数
* @param headers 头参数
* @param otherObject 其他相关设置
* @returns {CancelPromiseFactory<any>}
*/
fetchRequest(method: string, baseUrl: string, url: string, parameters: object, data: object, headers: object, otherObject: any = {}): INetworkStandardPromiseType<AxiosResponse|JNetworkError> {
let carryParams: object = JToolObject.getObjOrFuncResult(this.freezeCarryParams);
let carryHeaders: object = JToolObject.getObjOrFuncResult(this.freezeHeaders);
let carryBodyData: object = JToolObject.getObjOrFuncResult(this.freezeCarryBodyData);
const delegate = this.delegate;
let globalOtherParams = this.pickInjectParams();
let globalOtherHeaders = this.pickInjectHeaders();
let globalOtherBodyData = this.pickInjectBodyData();
this.clearExtraData();
let request: JRequester = JRequester.create(
method,
baseUrl,
url,
{...carryParams, ...globalOtherParams, ...parameters},
otherObject.notTransformData ? data : {...carryBodyData, ...globalOtherBodyData, ...data},
{
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
...carryHeaders,
...globalOtherHeaders,
...headers
},
{axiosConfig: this.axiosConfig, ...otherObject},
delegate
);
if (this.isSync){
return this.requestEngine.addRequest(request);
} else {
return CancelPromiseFactory.createJPromise((resolve, reject) => {
request.request().then((response: AxiosResponse) => {
if (response.status === 200) {
resolve(response);
} else {
let errorMessage, errorStatus;
if (response.hasOwnProperty('status')){
errorMessage = response.statusText;
errorStatus = response.status;
} else {
if (response.hasOwnProperty('message')){
errorMessage = response['message'];
}
}
reject(new JNetworkError(errorMessage, errorStatus))
}
}).catch(error => {
reject(error);
});
})
}
}
freedomPOST(baseUrl: string, url?: string, parameters?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError> {
return this.fetchRequest('post', baseUrl, url || '', parameters || {}, {}, headers || {}, otherObject || {});
}
freedomGET(baseUrl: string, url?: string, parameters?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError> {
return this.fetchRequest('get', baseUrl, url || '', parameters || {}, {},headers || {}, otherObject || {});
}
POST(url: string, parameters?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError> {
return this.freedomPOST(this.baseUrl, url, parameters, headers, {...this.axiosConfig, ...otherObject})
}
GET(url: string, parameters?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError> {
return this.freedomGET(this.baseUrl, url, parameters, headers, {...this.axiosConfig, ...otherObject})
}
freedomDataPOST(baseUrl: string, url?: string, data?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError>{
return this.fetchRequest('post', baseUrl, url || '', {}, data || {}, headers || {}, otherObject || {});
}
freedomDataGET(baseUrl: string, url?: string, data?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError>{
return this.fetchRequest('get', baseUrl, url || '', {}, data || {}, headers || {}, otherObject || {});
}
dataPOST(url?: string, data?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError>{
return this.freedomDataPOST(this.baseUrl, url, data, headers, {...this.axiosConfig, ...otherObject});
}
dataGET(url?: string, data?: object, headers?: object, otherObject?: object): INetworkStandardPromiseType<AxiosResponse|JNetworkError>{
return this.freedomDataGET(this.baseUrl, url, data, headers, {...this.axiosConfig, ...otherObject});
}
}