如何在Angular 4.3+中全局设置{ observe: 'response' }选项?
全局设置
observe: 'response'的可行方案 首先得明确一个关键点:你遇到的clone()方法没有observe选项的问题,本质是因为**observe并不是HttpRequest对象的属性**——它是HttpClient发起请求时的客户端配置,用来决定Angular是返回响应体还是完整的HttpResponse对象,不属于发送给服务器的请求本身的信息,所以HttpRequest的clone()方法自然不会包含这个参数,HttpInterceptor也没法直接修改它。
那有没有全局统一设置的办法?当然有,最靠谱的方式是封装自己的Http服务,把{ observe: 'response' }作为默认配置整合进去,替代原生的HttpClient使用:
import { Injectable } from '@angular/core'; import { HttpClient, HttpResponse, HttpRequestConfig } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class CustomHttpService { constructor(private http: HttpClient) {} // 封装GET请求,默认带上observe: 'response' get<T>(url: string, config?: Omit<HttpRequestConfig, 'observe'>): Observable<HttpResponse<T>> { return this.http.get<T>(url, { ...config, observe: 'response' }); } // 封装POST请求 post<T>(url: string, body: any, config?: Omit<HttpRequestConfig, 'observe'>): Observable<HttpResponse<T>> { return this.http.post<T>(url, body, { ...config, observe: 'response' }); } // 同理可以封装put、delete、patch等其他请求方法 }
之后在你的组件或服务里,注入这个CustomHttpService替代原生的HttpClient,所有请求就会默认返回完整的HttpResponse对象了,如果个别请求需要返回响应体,也可以手动覆盖observe选项:
// 全局默认返回完整响应 this.customHttp.get('/api/data').subscribe(response => { console.log(response.status); console.log(response.body); }); // 个别请求临时改为返回响应体 this.customHttp.get('/api/data', { observe: 'body' }).subscribe(body => { console.log(body); });
至于HttpInterceptor,它只能拦截和修改HttpRequest以及HttpResponse本身,但没法改变HttpClient处理响应的策略——如果请求时没设置observe: 'response',Angular已经把响应体提取出来了,Interceptor拿到的是响应体的Observable,没法再还原成完整的HttpResponse,所以这条路走不通。
内容的提问来源于stack exchange,提问作者Dalie
相关产品推荐
相关产品推荐

