小程序服务器请求封装,微信小程序封装request请求

/**

* http请求方法枚举*/declare type HttpMethod=

| 'GET'

| 'OPTIONS'

| 'HEAD'

| 'POST'

| 'PUT'

| 'DELETE'

| 'TRACE'

| 'CONNECT';/**

* http 请求封装*/interface HttpRequest {

url: string;

method?: HttpMethod;

data?: any;

token?: boolean;

}/**

* http请求回调*/interface HttpCallback {

onSuccess: SuccessCallback;

onServerError: ErrorCallback;

onNetworkError: ErrorCallback;

}/**

* 成功的callback*/type SuccessCallback= (data: string | Object | ArrayBuffer) => void;/**

* 错误的callback*/type ErrorCallback= (error: HttpError) => void;/**

* 请求错误*/interface HttpError {

code: number;

errMsg: string;

}/**

* http请求拦截器*/interface HttpInterceptor {

handleResponse(statusCode: number, data: string| Object |ArrayBuffer, callback: HttpCallback);

}/**

* 默认的网络拦截器*/class DefaultHttpInterceptor implements HttpInterceptor {

private readonly CODE_SUCCESS: number= 200;

public constructor() {}

handleResponse(statusCode: number, data: string| Object |ArrayBuffer, callback: HttpCallback) {//console.log(1);

let error: ServerError;if (statusCode == this.CODE_SUCCESS) {

callback.onSuccess(data);return;

}

error= newServerError(statusCode, data, callback.onServerError);

error.processError();

}

}//默认回调

export class DefaultCallback implements HttpCallback {

onSuccess: SuccessCallback;

onServerError: ErrorCallback;

onNetworkError: ErrorCallback;

constructor(success: SuccessCallback, serverError?: ErrorCallback, networkError?: ErrorCallback) {this.onSuccess =success;if(serverError) {this.onServerError =serverError;

}else{this.onServerError = error =>{

console.error(error.errMsg);

};

}if(networkError) {this.onNetworkError =networkError;

}else{this.onNetworkError = error =>{

console.error(error.errMsg);

};

}

}

}/**

* 服务器返回错误,如401,500等*/class ServerError implements HttpError {

private readonly ERROR_CODE_UNAUTH: number= 401;

private readonly ERROR_CODE_SERVER_ERROR: number= 500;

code: number;

errMsg: string;

callback: ErrorCallback;

constructor(code: number, data: any, callback: { (error: HttpError):void}) {this.code =code;this.errMsg =data.msg;this.callback =callback;

}/**

* 网络请求错误处理

* @param callback*/processError() {

console.error('error code: ' + this.code + ', error message: ' + this.errMsg);if (this.code == this.ERROR_CODE_UNAUTH) {//处理401未认证错误

} else if (this.code >= this.ERROR_CODE_SERVER_ERROR) {//处理500服务器返回错误

} else{//处理未知错误

}

}

}/**

* 网络请求客户端*/class HttpClient {

private static readonly host: string= 'http://127.0.0.1:8686';

private static instance: HttpClient;

private DefaultInterceptor: HttpInterceptor;

private constructor() {this.DefaultInterceptor = newDefaultHttpInterceptor();

}/**

* 单例*/public static getInstance(): HttpClient {if (!this.instance) {this.instance = newHttpClient();

}return this.instance;

}/**

* 网络请求方法

* @param request 网络请求元素

* @param callback 请求回调

* @param interceptor 自定义拦截器*/public request(request: HttpRequest, callback?: DefaultCallback, interceptor?: HttpInterceptor) {

let method= request.method === undefined ? 'GET': request.method;

wx.request({

url:this.buildUrl(request.url),

data: request.data,

method: method,

header:this.buildHeader(method, request.token),

success: res=>{

console.log(res);if(interceptor) {

interceptor.handleResponse(res.statusCode, res.data, callback);

}else{this.DefaultInterceptor.handleResponse(res.statusCode, res.data, callback);

}

},

fail: (err: HttpError)=>{

console.log(err);if(callback.onNetworkError) {

callback.onNetworkError(err);

}

},

});

}/**

* 构建header

* @param method

* @param needToken*/private buildHeader(method: HttpMethod, needToken= false): Object {

let contentType: string;if (method == 'GET') {

contentType= '';

}else{

contentType= '';

}return{

contentType: contentType,

token: needToken? 'token' : '',

};

}/**

* 构建url

* @param url*/private buildUrl(url: string): string {return HttpClient.host +url;

}

}

export const Api= HttpClient.getInstance();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值