在上篇Angular拦截器实现RESTful认证中,通过替换了Http
的提供器来拦截了Http
请求,并且重新实现ConnectionBackend
抽象类,并用它发起请求来达到了统一对请求进行拦截处理的功能。
但是那种实现存在问题:
Angular拦截器存在的问题
但是在实际应用中发现,使用这种方案会导致每次请求都会被发送两次。调试后发现原因如下:
- Angular应用中
Http
返回的是一个Observable
流对象,此对象的实现是RXjs
封装的 - 而在
RXjs
中对Observable
的处理是冷模式,即被订阅后才发送请求。 - 之前的拦截器实现会直接在创建对象时就直接发送请求,被订阅时又再次发送请求
这一问题导致了比如发送一条向数据库中插入数据的http
请求时,第一条请求插入了数据,第二条请求被返回数据已经存在的错误。客户端接收到数据已经存在的错误,对视图进行错误的更新。
改造Http实现对请求和结果预处理
封装新的HttpService
实现的基本思路是新建一个自己的Service来处理http请求,在此Service中对request
和response
进行统一的处理后再调用Angular提供的HttpModule
来对后端数据接口发起请求。
具体实现如下:
在appModule中提供服务
|
|
然后只需要把原来注入Http的地方替换成MyHttpService
就行了,嗯‘只要’……‘就行了’……