首先想到的是使用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>;
答案 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'
}
);
... setHeaders
和url
在此可选。