如何在Angular 4.3+中全局设置{observe:'response'}选项?

时间:2018-01-31 13:22:17

标签: angular response interceptor

首先想到的是使用HttpInterceptor,但clone(...)方法的签名不包含observe选项。除了为每个请求定义{ observe: 'response' }选项之外,我没有看到替代尚未 ...

那么,是否存在设置{ observe: 'response' }选项全局的方法,例如:通过HttpInterceptor

clone(update: {
   headers?: HttpHeaders;
   reportProgress?: boolean;
   params?: HttpParams;
   responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
   withCredentials?: boolean;
   body?: T | null;
   method?: string;
   url?: string;
   setHeaders?: {
       [name: string]: string | string[];
   };
   setParams?: {
       [param: string]: string;
   };
}): HttpRequest<T>;

3 个答案:

答案 0 :(得分:1)

我知道这个问题很老但是很有趣。

我考虑了httpClient方法的覆盖。

您只需要重写一次方法。 并且所有工作都将完成。

像这样的GET方法:

  overrideGetRequest() {
    const httpRequest = this.http.get.bind(this.http);

    this.http.get = function get<T = any>(url: string, options?: any): Observable<T> {
      let requestOptions = options || {};
      if(!('observe' in requestOptions)) {
      requestOptions = { ...requestOptions, observe: "response" };
      }
      return httpRequest(url, requestOptions);
    };
  }

这是Stackblitz示例,在此示例中,我重写了httpClient的POST和GET方法。

https://stackblitz.com/edit/angular-interceptors-kknew1?file=app%2Fapp.component.ts

答案 1 :(得分:0)

拦截器最适合在所有请求上设置标头,例如Authorization标头。不过,对于全局选项,您可以使用一个包装方法来代替HttpClient的get()方法:

constructor(private http: HttpClient) {}

get<T>(url: string, params?: { [param: string]: string }): Observable<HttpResponse<T>> {
    return this.http.get<T>(url, {
      params: new HttpParams({ fromObject: params }),
      observe: 'response',
    });
  }

这可以在您的服务中使用,也可以制作一个单独的自定义http服务,该服务封装了每种方法-发布,补丁,删除等。

答案 2 :(得分:-1)

您可以通过{ observe: 'response' }添加setParams,同时克隆需求:

request.clone(
    {
      setParams: { observe: 'response' },
      setHeaders: { 'some': 'header' },
      url: 'some.url'
    }
  );

... setHeadersurl在此可选。