2016-09-10 68 views

回答

7

我创建了我从我的所有服务使用HTTP的辅助方法。这至少可以集中通过应用程序的所有http活动。

处理错误的详细信息,有时虽然 - 见我的问题在这里: Angular 2 http service. Get detailed error information

UPD:2016年9月12日 - 固定remove方法。 Angular http服务需要定义身体。这种方法存在的原因 - 我希望能够通过身体作为delete请求的一部分,而Angular的方法不允许这样做。

import {Injectable} from '@angular/core'; 
import {Http, Request, Response, Headers, RequestOptionsArgs, RequestMethod} from "@angular/http"; 
import {RequestArgs} from "@angular/http/src/interfaces"; 
import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 

@Injectable() 
export class JsonHttpHelper { 
    protected headers: Headers; 

    constructor(private _http: Http) { 
     this.headers = new Headers(); 
     this.headers.append('Content-Type', 'application/json'); 
     this.headers.append('Accept', 'application/json'); 
    } 

    get(url:string) : Observable<any> { 
     return this._http.get(url) 
      .map((res: Response) => res.json()) 
      .catch(this.handleError); 
    } 

    post(url:string, data:any, args?: RequestOptionsArgs) : Observable<any> { 
     if (args == null) args = {}; 
     if (args.headers === undefined) args.headers = this.headers; 

     return this._http.post(url, JSON.stringify(data), args) 
      .map((res: Response) => JsonHttpHelper.json(res)) 
      .catch(this.handleError); 
    } 

    put(url:string, data:any, args?: RequestOptionsArgs) : Observable<any> { 
     if (args == null) args = {}; 
     if (args.headers === undefined) args.headers = this.headers; 

     return this._http.put(url, JSON.stringify(data), args) 
      .map((res: Response) => JsonHttpHelper.json(res)) 
      .catch(this.handleError); 
    } 

    remove(url: string, data?: any, args?: RequestOptionsArgs): Observable<any> { 
     if (args == null) args = {}; 

     args.url = url; 
     args.method = RequestMethod.Delete; 
     if (!args.headers) args.headers = this.headers; 
     args.body = data ? JSON.stringify(data) : null; 

     return this._http.request(new Request(<RequestArgs>args)) 
      .map((res: Response) => JsonHttpHelper.json(res)) 
      .catch(this.handleError); 
    } 

    private static json(res: Response): any { 
     return res.text() === "" ? res : res.json(); 
    } 

    private handleError(error:any) { 
     console.error(error); 
     return Observable.throw(error); 

     // The following doesn't work. 
     // There's no error status at least in case of network errors. 
     // WHY?! 
     // 
     // if (error === undefined) error = null; 
     // let errMsg = (error && error.message) 
     //  ? error.message 
     //  : (error && error.status) 
     //   ? `${error.status} - ${error.statusText}` 
     //   : error; 
     // 
     // return Observable.throw(errMsg); 
    } 
} 
+0

当某个组件调用JsonHttpHelper实现自己的catch函数时会发生什么。哪个会被调用?或者哪个会被首先调用? –

+0

Helper将是第一个,但它会重新引发错误,因此您还可以在组件中找到它。 – rook

+1

我认为它不会重新抛出它。我实现了这样的事情,并且在助手的catch中被调用。只有调用者中的'then'被调用,除非我在助手中手动重新显示错误或者更好地(对于我的情况)抛出其他东西。但这个答案解决了我的问题。谢谢 –