mirror of
https://gitee.com/dgflash/oops-plugin-framework.git
synced 2026-05-09 22:02:45 +08:00
383 lines
12 KiB
TypeScript
383 lines
12 KiB
TypeScript
/*
|
|
* @Author: dgflash
|
|
* @Date: 2022-09-01 18:00:28
|
|
* @LastEditors: dgflash
|
|
* @LastEditTime: 2022-09-09 18:10:50
|
|
*/
|
|
import { error, warn } from "cc";
|
|
|
|
var urls: any = {}; // 当前请求地址集合
|
|
var reqparams: any = {}; // 请求参数
|
|
|
|
/** 请求事件 */
|
|
export enum HttpEvent {
|
|
/** 断网 */
|
|
NO_NETWORK = "http_request_no_network",
|
|
/** 未知错误 */
|
|
UNKNOWN_ERROR = "http_request_unknown_error",
|
|
/** 请求超时 */
|
|
TIMEOUT = "http_request_timout"
|
|
}
|
|
|
|
export class HttpReturn {
|
|
isSucc: boolean = false;
|
|
res?: any;
|
|
err?: any;
|
|
}
|
|
|
|
/** HTTP请求 */
|
|
export class HttpRequest {
|
|
/** 服务器地址 */
|
|
server: string = "http://127.0.0.1/";
|
|
/** 请求超时时间 */
|
|
timeout: number = 10000;
|
|
/** 自定义请求头信息 */
|
|
header: Map<string, string> = new Map<string, string>();
|
|
|
|
/**
|
|
* 添加自定义请求头信息
|
|
* @param name 信息名
|
|
* @param value 信息值
|
|
*/
|
|
addHeader(name: string, value: string) {
|
|
this.header.set(name, value);
|
|
}
|
|
|
|
/**
|
|
* HTTP GET请求
|
|
* @param name 协议名
|
|
* @param completeCallback 请求完整回调方法
|
|
* @param errorCallback 请求失败回调方法
|
|
* @example
|
|
var complete = function(response){
|
|
console.log(response);
|
|
}
|
|
var error = function(response){
|
|
console.log(response);
|
|
}
|
|
oops.http.get(name, complete, error);
|
|
*/
|
|
get(name: string, completeCallback: Function, errorCallback: Function) {
|
|
this.sendRequest(name, null, false, completeCallback, errorCallback)
|
|
}
|
|
|
|
/**
|
|
* HTTP GET请求
|
|
* @param name 协议名
|
|
* @param params 查询参数
|
|
* @param completeCallback 请求完整回调方法
|
|
* @param errorCallback 请求失败回调方法
|
|
* @example
|
|
var param = '{"uid":12345}'
|
|
var complete = function(response){
|
|
var jsonData = JSON.parse(response);
|
|
var data = JSON.parse(jsonData.Data);
|
|
console.log(data.Id);
|
|
}
|
|
var error = function(response){
|
|
console.log(response);
|
|
}
|
|
oops.http.getWithParams(name, param, complete, error);
|
|
*/
|
|
getWithParams(name: string, params: any, completeCallback: Function, errorCallback: Function) {
|
|
this.sendRequest(name, params, false, completeCallback, errorCallback)
|
|
}
|
|
|
|
/**
|
|
* HTTP GET请求
|
|
* @param name 协议名
|
|
* @param params 查询参数
|
|
* @returns
|
|
*/
|
|
getAsync(name: string, params: any = null): Promise<HttpReturn> {
|
|
return new Promise((resolve, reject) => {
|
|
var ret: HttpReturn = new HttpReturn();
|
|
var complete = function (response: any) {
|
|
ret.isSucc = true;
|
|
ret.res = response;
|
|
resolve(ret);
|
|
}
|
|
var error = function (response: any) {
|
|
ret.isSucc = true;
|
|
ret.err = response;
|
|
resolve(ret);
|
|
}
|
|
this.sendRequest(name, params, false, complete, error)
|
|
});
|
|
}
|
|
|
|
/**
|
|
* HTTP GET请求非文本格式数据
|
|
* @param name 协议名
|
|
* @param completeCallback 请求完整回调方法
|
|
* @param errorCallback 请求失败回调方法
|
|
*/
|
|
getByArraybuffer(name: string, completeCallback: Function, errorCallback: Function) {
|
|
this.sendRequest(name, null, false, completeCallback, errorCallback, 'arraybuffer', false);
|
|
}
|
|
|
|
/**
|
|
* HTTP GET请求非文本格式数据
|
|
* @param name 协议名
|
|
* @param params 查询参数
|
|
* @param completeCallback 请求完整回调方法
|
|
* @param errorCallback 请求失败回调方法
|
|
*/
|
|
getWithParamsByArraybuffer(name: string, params: any, completeCallback: Function, errorCallback: Function) {
|
|
this.sendRequest(name, params, false, completeCallback, errorCallback, 'arraybuffer', false);
|
|
}
|
|
|
|
/**
|
|
* HTTP GET请求非文本格式数据
|
|
* @param name 协议名
|
|
* @param params 查询参数
|
|
* @returns Promise<any>
|
|
*/
|
|
getAsyncByArraybuffer(name: string, params: any = null): Promise<HttpReturn> {
|
|
return new Promise((resolve, reject) => {
|
|
var ret: HttpReturn = new HttpReturn();
|
|
var complete = function (response: any) {
|
|
ret.isSucc = true;
|
|
ret.res = response;
|
|
resolve(ret);
|
|
}
|
|
var error = function (response: any) {
|
|
ret.isSucc = true;
|
|
ret.err = response;
|
|
resolve(ret);
|
|
}
|
|
this.sendRequest(name, params, false, complete, error, 'arraybuffer', false);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* HTTP POST请求
|
|
* @param name 协议名
|
|
* @param params 查询参数
|
|
* @param completeCallback 请求完整回调方法
|
|
* @param errorCallback 请求失败回调方法
|
|
* @example
|
|
var param = '{"LoginCode":"donggang_dev","Password":"e10adc3949ba59abbe56e057f20f883e"}'
|
|
var complete = function(response){
|
|
var jsonData = JSON.parse(response);
|
|
var data = JSON.parse(jsonData.Data);
|
|
console.log(data.Id);
|
|
}
|
|
var error = function(response){
|
|
console.log(response);
|
|
}
|
|
oops.http.post(name, param, complete, error);
|
|
*/
|
|
post(name: string, params: any, completeCallback?: Function, errorCallback?: Function) {
|
|
this.sendRequest(name, params, true, completeCallback, errorCallback);
|
|
}
|
|
|
|
/**
|
|
* HTTP POST请求
|
|
* @param name 协议名
|
|
* @param params 查询参数
|
|
* @returns
|
|
*/
|
|
postAsync(name: string, params: any = null): Promise<HttpReturn> {
|
|
return new Promise((resolve, reject) => {
|
|
var ret: HttpReturn = new HttpReturn();
|
|
var complete = function (response: any) {
|
|
ret.isSucc = true;
|
|
ret.res = response;
|
|
resolve(ret);
|
|
}
|
|
var error = function (response: any) {
|
|
ret.isSucc = true;
|
|
ret.err = response;
|
|
resolve(ret);
|
|
}
|
|
this.sendRequest(name, params, true, complete, error);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 取消请求中的请求
|
|
* @param name 协议名
|
|
*/
|
|
abort(name: string) {
|
|
var xhr = urls[this.server + name];
|
|
if (xhr) {
|
|
xhr.abort();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获得字符串形式的参数
|
|
* @param params 参数对象
|
|
* @returns 参数字符串
|
|
*/
|
|
private getParamString(params: any) {
|
|
var result = "";
|
|
for (var name in params) {
|
|
let data = params[name];
|
|
if (data instanceof Object) {
|
|
for (var key in data)
|
|
result += `${key}=${data[key]}&`;
|
|
}
|
|
else {
|
|
result += `${name}=${data}&`;
|
|
}
|
|
}
|
|
return result.substring(0, result.length - 1);
|
|
}
|
|
|
|
/**
|
|
* Http请求
|
|
* @param name(string) 请求地址
|
|
* @param params(JSON) 请求参数
|
|
* @param isPost(boolen) 是否为POST方式
|
|
* @param callback(function) 请求成功回调
|
|
* @param errorCallback(function) 请求失败回调
|
|
* @param responseType(string) 响应类型
|
|
*/
|
|
private sendRequest(name: string,
|
|
params: any,
|
|
isPost: boolean,
|
|
completeCallback?: Function,
|
|
errorCallback?: Function,
|
|
responseType?: string,
|
|
isOpenTimeout = true,
|
|
timeout: number = this.timeout) {
|
|
if (name == null || name == '') {
|
|
error("请求地址不能为空");
|
|
return;
|
|
}
|
|
|
|
var url: string, newUrl: string, paramsStr: string;
|
|
if (name.toLocaleLowerCase().indexOf("http") == 0) {
|
|
url = name;
|
|
}
|
|
else {
|
|
url = this.server + name;
|
|
}
|
|
|
|
if (params) {
|
|
paramsStr = this.getParamString(params);
|
|
if (url.indexOf("?") > -1)
|
|
newUrl = url + "&" + paramsStr;
|
|
else
|
|
newUrl = url + "?" + paramsStr;
|
|
}
|
|
else {
|
|
newUrl = url;
|
|
}
|
|
|
|
if (urls[newUrl] != null && reqparams[newUrl] == paramsStr!) {
|
|
warn(`地址【${url}】已正在请求中,不能重复请求`);
|
|
return;
|
|
}
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
// 防重复请求功能
|
|
urls[newUrl] = xhr;
|
|
reqparams[newUrl] = paramsStr!;
|
|
|
|
if (isPost) {
|
|
xhr.open("POST", url);
|
|
}
|
|
else {
|
|
xhr.open("GET", newUrl);
|
|
}
|
|
|
|
// 添加自定义请求头信息
|
|
for (const [key, value] of this.header) {
|
|
xhr.setRequestHeader(key, value);
|
|
}
|
|
// xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
|
|
// xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
|
|
|
|
var data: any = {};
|
|
data.url = url;
|
|
data.params = params;
|
|
|
|
// 请求超时
|
|
if (isOpenTimeout) {
|
|
xhr.timeout = timeout;
|
|
xhr.ontimeout = () => {
|
|
this.deleteCache(newUrl);
|
|
|
|
data.event = HttpEvent.TIMEOUT;
|
|
|
|
if (errorCallback) errorCallback(data);
|
|
}
|
|
}
|
|
|
|
xhr.onloadend = (a) => {
|
|
if (xhr.status == 500) {
|
|
this.deleteCache(newUrl);
|
|
|
|
if (errorCallback == null) return;
|
|
|
|
data.event = HttpEvent.NO_NETWORK; // 断网
|
|
|
|
if (errorCallback) errorCallback(data);
|
|
}
|
|
}
|
|
|
|
xhr.onerror = () => {
|
|
this.deleteCache(newUrl);
|
|
|
|
if (errorCallback == null) return;
|
|
|
|
if (xhr.readyState == 0 || xhr.readyState == 1 || xhr.status == 0) {
|
|
data.event = HttpEvent.NO_NETWORK; // 断网
|
|
}
|
|
else {
|
|
data.event = HttpEvent.UNKNOWN_ERROR; // 未知错误
|
|
}
|
|
|
|
if (errorCallback) errorCallback(data);
|
|
};
|
|
|
|
xhr.onreadystatechange = () => {
|
|
if (xhr.readyState != 4) return;
|
|
|
|
this.deleteCache(newUrl);
|
|
|
|
if (xhr.status == 200) {
|
|
if (completeCallback) {
|
|
if (responseType == 'arraybuffer') {
|
|
// 加载非文本格式
|
|
xhr.responseType = responseType;
|
|
if (completeCallback) completeCallback(xhr.response);
|
|
}
|
|
else {
|
|
// 加载非文本格式
|
|
var data: any = JSON.parse(xhr.response);
|
|
if (data.code != null) {
|
|
/** 服务器错误码处理 */
|
|
if (data.code == 0) {
|
|
if (completeCallback) completeCallback(data.data);
|
|
}
|
|
else {
|
|
if (errorCallback) errorCallback(data);
|
|
}
|
|
}
|
|
else {
|
|
if (completeCallback) completeCallback(data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
if (params == null || params == "") {
|
|
xhr.send();
|
|
}
|
|
else {
|
|
xhr.send(paramsStr!); // 根据服务器接受数据方式做选择
|
|
// xhr.send(JSON.stringify(params));
|
|
}
|
|
}
|
|
|
|
private deleteCache(url: string) {
|
|
delete urls[url];
|
|
delete reqparams[url];
|
|
}
|
|
} |