wangtengyu
2018-11-06 a5a6487bd568fda30c7204ef3e3b7a2ed0a9019c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { Injectable } from '@angular/core';
import { Http, Headers, Response, Request, RequestMethod, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import * as moment from 'moment';
import { LoadingService } from './loading.service';
import { ApiResult } from 'kl/model';
 
@Injectable()
export class HttpClient {
 
  constructor(private http: Http, private loading: LoadingService) { }
 
  get(api: string, fun: Function) {
    this.getResponse(this.http.get(api), fun);
  }
 
  post (api: string, params: Object, fun: Function) {
    this.getResponse(this.http.post(api, params), fun);
  }
 
  xhrPost(api, data, fun) {
    let xhr = new XMLHttpRequest();
    xhr.open('POST', api, false);
    xhr.onload = () => fun(JSON.parse(xhr.response));
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(JSON.stringify(data) );
  }
 
  private getResponse(res: Observable<Response>, fun) {
    res.subscribe(response => {
      let json = response.json();
      fun(json);
      }, error => {}
    );
  }
 
  request<T>(url: string, method: RequestMethod, body?: any, showLoading?: boolean): Observable<ApiResult<T>> {
    let headers = new Headers();
 
    let options = new RequestOptions();
    options.headers = headers;
    options.url = url;
    options.method = method;
    options.body = body;
    options.withCredentials = true;
 
    let request = new Request(options);
 
    if (showLoading !== false) this.loading.show();
 
    return this.http.request(request)
      .finally(() => {
        if (showLoading !== false) this.loading.hide();
      }).map(r => r.json() as T)
      .catch(x => this.handleError(x));
  }
 
  /**
   * 将字典转为QueryString
   */
  private _formatUrl(params?: { [key: string]: string }): string {
    if (!params) return '';
 
    let fegment = [];
    for (let k in params) {
      let v: any = params[k];
      if (v instanceof Date) {
        v = moment(v).format('YYYY-MM-DD HH:mm:SS');
      }
      fegment.push(`${k}=${v}`);
    }
    return '?' + fegment.join('&');
  }
 
  /**
  * 通用异常处理
  */
  private handleError(error: Response | any) {
    let errMsg: string;
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body.error || JSON.stringify(body);
      errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
    } else {
      errMsg = error ? error.toString() : '服务器发生异常,请稍后再试';
    }
    return Observable.throw(errMsg);
  }
}