美文网首页Ios@IONIC
Angularjs HttpClient 拦截器使用

Angularjs HttpClient 拦截器使用

作者: JESiller | 来源:发表于2017-11-24 11:19 被阅读523次

    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数组中列出的顺序)。

    不可变性

    拦截器要检查和修改准备发出的请求和接收进来的响应。但是,你可能会惊奇的发现HttpRequestHttpResponse类在很大程度上却是不可变的。

    这是有原因的:因为应用可能会重发请求,而拦截器链可能会多次处理同一个请求。如果请求是可变的,每次重试时的请求都可能和原始的请求不一样。而不可变对象可以确保拦截器每次重试时处理的都是同一个请求。

    在一种情况下类型安全体系无法在写拦截器时提供保护 —— 请求体(body)。在拦截器中修改请求体本应是无效的,但类型检查系统无法发现它。

    如果确实需要修改请求体,我们就得自己复制它,修改这个复本,然后使用clone()来复制这个请求,并使用这个新的请求体。

    由于请求都是不可变的,所以不能直接修改它们。要想修改,就使用clone()函数。

    HttpRequest  clone 方法

    从HttpRequest的clone方法可以得知,我们在拦截器中,如果需要修改原先请求的请求头,请求体,请求参数等时,可以采用clone的方式,产生新的请求,HttpHandler 继续往下处理新的请求。

    相关文章

      网友评论

        本文标题:Angularjs HttpClient 拦截器使用

        本文链接:https://www.haomeiwen.com/subject/vlmxbxtx.html