http.ts 7.7 KB
Newer Older
neko's avatar
neko committed
1 2
import axios, { AxiosResponse } from 'axios';
import qs from 'qs';
KK's avatar
KK committed
3
import { HttpResponse } from './http-response';
KK's avatar
KK committed
4
import { Loading } from '../loading/loading';
neko's avatar
neko committed
5 6 7 8 9 10 11 12 13
/**
 * Http net 对象
 * 调用 getInstance() 获取实例
 *
 * @class Http
 */
export class Http {

    /**
14
     * 获取 Http 单例对象
neko's avatar
neko committed
15 16
     *
     * @static
17
     * @returns {Http}
neko's avatar
neko committed
18 19
     * @memberof Http
     */
20 21 22 23 24 25
    public static getInstance(): Http {
        if (!Http.Http) {
            Http.Http = new Http();
        }
        return this.Http;
    }
neko's avatar
neko committed
26 27

    /**
28 29 30 31 32
     * 单例变量声明
     *
     * @private
     * @static
     * @type {Http}
neko's avatar
neko committed
33 34
     * @memberof Http
     */
35
    private static Http: Http;
neko's avatar
neko committed
36 37

    /**
38
     * 统计加载
neko's avatar
neko committed
39
     *
40
     * @type {number}
neko's avatar
neko committed
41 42
     * @memberof Http
     */
43
    private loadingCount: number = 0;
neko's avatar
neko committed
44 45

    /**
46
     * load状态管理器
neko's avatar
neko committed
47
     *
48 49
     * @private
     * @type {(ElLoadingComponent | any)}
neko's avatar
neko committed
50 51
     * @memberof Http
     */
52
    private elLoadingComponent: any;
neko's avatar
neko committed
53 54

    /**
55 56
     * Creates an instance of Http.
     * 私有构造,拒绝通过 new 创建对象
neko's avatar
neko committed
57 58 59
     * 
     * @memberof Http
     */
60
    private constructor() { }
neko's avatar
neko committed
61 62

    /**
63
     * post请求
neko's avatar
neko committed
64 65
     *
     * @param {string} url
66 67 68
     * @param {*} [params={}]
     * @param {boolean} [isloading]
     * @param {number} [serialnumber]
neko's avatar
neko committed
69 70 71
     * @returns {Promise<any>}
     * @memberof Http
     */
72 73 74 75 76
    public post(url: string, params: any = {}, isloading?: boolean, serialnumber?: number): Promise<any> {
        if (isloading) {
            this.beginLoading();
        }
        params = this.handleRequestData(params);
neko's avatar
neko committed
77
        return new Promise((resolve: any, reject: any) => {
78 79 80 81 82 83 84 85 86 87 88 89 90
            axios({
                method: 'post',
                url: url,
                data: params,
                headers: { 'Content-Type': 'application/json;charset=UTF-8', 'Accept': 'application/json' },
                // transformResponse: [(data: any) => {
                //     let _data: any = null;
                //     try {
                //         _data = JSON.parse(JSON.stringify(data));
                //     } catch (error) {
                //     }
                //     return _data;
                // }],
KK's avatar
KK committed
91 92 93 94
            }).then((response: AxiosResponse) => {
                resolve(this.doResponseRresult(response, resolve, isloading, serialnumber));
            }).catch((response: AxiosResponse) => {
                reject(this.doResponseRresult(response, reject, isloading, serialnumber));
neko's avatar
neko committed
95 96 97 98 99
            });
        });
    }

    /**
100
     * 获取
neko's avatar
neko committed
101 102
     *
     * @param {string} url
103 104 105
     * @param {*} [params={}]
     * @param {boolean} [isloading]
     * @param {number} [serialnumber]
neko's avatar
neko committed
106 107 108
     * @returns {Promise<any>}
     * @memberof Http
     */
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    public get(url: string,params: any = {}, isloading?: boolean, serialnumber?: number): Promise<any> {
        params = this.handleRequestData(params);
        if(params.srfparentdata){
            Object.assign(params,params.srfparentdata);
            delete params.srfparentdata;
        }
        if((Object.keys(params)).length>0){
            let tempParam:any = {};
            let sort:any = null;
            Object.keys(params).forEach((item:any) =>{
                if( params[item] || Object.is(params[item],0) ){
                    if (Object.is(item,'sort')){
                      sort = params[item];
                    }else{
                      tempParam[item] = params[item];
                    }
                }
            })
            url += `?${qs.stringify(tempParam)}`;
            if(sort){
                url += '&sort='+sort;
            }
        }  
        if (isloading) {
            this.beginLoading();
neko's avatar
neko committed
134 135
        }
        return new Promise((resolve: any, reject: any) => {
KK's avatar
KK committed
136 137 138 139 140
            axios.get(url).then((response: AxiosResponse) => {
                resolve(this.doResponseRresult(response, resolve, isloading, serialnumber));
                
            }).catch((response: AxiosResponse) => {
                reject(this.doResponseRresult(response, reject, isloading, serialnumber));
neko's avatar
neko committed
141 142 143 144 145
            });
        });
    }

    /**
146
     * 删除
neko's avatar
neko committed
147 148
     *
     * @param {string} url
149 150
     * @param {boolean} [isloading]
     * @param {number} [serialnumber]
neko's avatar
neko committed
151 152 153
     * @returns {Promise<any>}
     * @memberof Http
     */
154 155 156
    public delete(url: string, isloading?: boolean,data?:any, serialnumber?: number): Promise<any> {
        if (isloading) {
            this.beginLoading();
neko's avatar
neko committed
157 158
        }
        return new Promise((resolve: any, reject: any) => {
159 160
            if(!data){
                axios.delete(url).then((response: any) => {
KK's avatar
KK committed
161
                    resolve(this.doResponseRresult(response, resolve, isloading, serialnumber));
162
                }).catch((response: any) => {
KK's avatar
KK committed
163
                    reject(this.doResponseRresult(response, reject, isloading, serialnumber));
164 165 166
                });
            }else{
                axios.delete(url,{data:data}).then((response: any) => {
KK's avatar
KK committed
167
                    resolve(this.doResponseRresult(response, resolve, isloading, serialnumber));
168
                }).catch((response: any) => {
KK's avatar
KK committed
169
                    reject(this.doResponseRresult(response, reject, isloading, serialnumber));
170 171
                });
            }
neko's avatar
neko committed
172 173 174 175 176 177 178 179
        });
    }

    /**
     * 修改数据
     *
     * @param {string} url
     * @param {*} data
180 181
     * @param {boolean} [isloading]
     * @param {number} [serialnumber]
neko's avatar
neko committed
182 183 184
     * @returns {Promise<any>}
     * @memberof Http
     */
185 186 187
    public put(url: string, data: any, isloading?: boolean, serialnumber?: number): Promise<any> {
        if (isloading) {
            this.beginLoading();
neko's avatar
neko committed
188
        }
189
        data = this.handleRequestData(data);
neko's avatar
neko committed
190
        return new Promise((resolve: any, reject: any) => {
191
            axios.put(url, data).then((response: any) => {
KK's avatar
KK committed
192
                resolve(this.doResponseRresult(response, resolve, isloading, serialnumber));
193
            }).catch((response: any) => {
KK's avatar
KK committed
194
                reject(this.doResponseRresult(response, reject, isloading, serialnumber));
neko's avatar
neko committed
195 196 197 198 199 200 201 202 203
            });
        });
    }

    /**
     * 处理响应结果
     *
     * @private
     * @param {*} response
204 205 206
     * @param {Function} funt
     * @param {boolean} [isloading]
     * @param {number} [serialnumber]
neko's avatar
neko committed
207 208
     * @memberof Http
     */
KK's avatar
KK committed
209
    private doResponseRresult(response: any, funt: Function, isloading?: boolean, serialnumber?: number): HttpResponse {
210 211 212 213 214
        if (isloading) {
            this.endLoading();
        }
        if (serialnumber) {
            Object.assign(response, { serialnumber: serialnumber });
neko's avatar
neko committed
215
        }
KK's avatar
KK committed
216 217 218 219 220 221 222
        if (response) {
            if (response.status === 200) {
                return new HttpResponse(200, response.data, undefined, response.headers);
            }
            return new HttpResponse(response.status, response.data, { code: 101, message: HttpResponse.getStatusMessage(response.status) }, response.headers)
        }
        return new HttpResponse(500, null, { code: 100, message: '请求发生异常,无返回结果!' }, response.headers);
223 224 225 226 227 228 229 230 231 232
    }

    /**
     * 开始加载
     *
     * @private
     * @memberof Http
     */
    private beginLoading(): void {
        // todo 开始加载
KK's avatar
KK committed
233
        Loading.show();
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
    }

    /**
     * 加载结束
     *
     * @private
     * @memberof Http
     */
    private endLoading(): void {
        if (this.loadingCount > 0) {
            this.loadingCount--;
        }
        setTimeout(() => {
            if (this.loadingCount === 0) {
               // todo 停止加载
KK's avatar
KK committed
249
               Loading.hidden();
250 251
            }
        }, 500);
neko's avatar
neko committed
252 253 254 255 256 257 258 259 260
    }

    /**
     * 处理请求数据
     * 
     * @private
     * @param data 
     * @memberof Http
     */
261 262
    private handleRequestData(data:any){
        if(data.srfsessionkey){
neko's avatar
neko committed
263 264
            delete data.srfsessionkey;
        }
265
        if(data.srfsessionid){
neko's avatar
neko committed
266 267 268 269 270 271
            delete data.srfsessionid;
        }
        return data;
    }

}