Angularjs Httpclient 官方文档
文档对Angularjs对HttpClient的使用,介绍都挺清楚,对于新手入门是一个很好的指导,一下对拦截器的使用做一个简单的总结:
1.拦截器使用方式
1.1 新建文件实现HttpInterceptor接口
next是一个HttpHandler,是一个类似于intercept的接口,它会把一个请求对象转换成一个可观察的响应对象。在拦截器中,next总是代表位于拦截器链中的下一个拦截器(如果有的话),如果没有更多拦截器了,它就会是最终的后端。所以,大多数拦截器的最后一句都会以它们转换后请求对象为参数调用next.handle函数。
1.2 在app.module.ts下配置所写的拦截器
事件
注意,intercept和HttpHandler.handle返回的可观察对象并不是Observable<HttpResponse>,而是Observable<HttpEvent>。这是因为拦截器所工作的层级要低于HttpClient接口。单个请求会生成多个事件,比如表示上传和下载过程的事件。HttpResponse类实际上本身也是一个事件,只是它的type是HttpEventType.HttpResponseEvent。
拦截器必须透传所有它不理解或不打算修改的事件。它不能过滤掉自己不准备处理的事件。很多拦截器只关心要发出的请求,而只简单的返回next所返回的事件流,而不修改它。
顺序
Ordering
当我们在一个应用中提供了多个拦截器时,Angular 会按照你提供时的顺序应用它们(译注:即模块的providers数组中列出的顺序)。
不可变性
拦截器要检查和修改准备发出的请求和接收进来的响应。但是,你可能会惊奇的发现HttpRequest和HttpResponse类在很大程度上却是不可变的。
这是有原因的:因为应用可能会重发请求,而拦截器链可能会多次处理同一个请求。如果请求是可变的,每次重试时的请求都可能和原始的请求不一样。而不可变对象可以确保拦截器每次重试时处理的都是同一个请求。
在一种情况下类型安全体系无法在写拦截器时提供保护 —— 请求体(body)。在拦截器中修改请求体本应是无效的,但类型检查系统无法发现它。
如果确实需要修改请求体,我们就得自己复制它,修改这个复本,然后使用clone()来复制这个请求,并使用这个新的请求体。
由于请求都是不可变的,所以不能直接修改它们。要想修改,就使用clone()函数。
HttpRequest clone 方法
从HttpRequest的clone方法可以得知,我们在拦截器中,如果需要修改原先请求的请求头,请求体,请求参数等时,可以采用clone的方式,产生新的请求,HttpHandler 继续往下处理新的请求。
网友评论