- 小川充
- @mitsuruog
- Front-end Developer in Givery inc.
- Angular User Group Staff.
- XHRに関連する横断的機能(cross-cutting)を分離する
- Global Error handling
- Fail back to show notification
- Angular1ではHttpInterceptorを使うことで、これらを綺麗に分離できた
- refs: AngularJS: API: $http
結論
簡単にできない!!
following step
- 既存のHttpをOverrideするための
CustomHttp
サービスを作成する bootstrap
で既存のHttpをOverideする
custom-http.service.ts
import {Http, ConnectionBackend, RequestOptions, Request, RequestOptionsArgs, Response} from "angular2/http";
import {Observable} from "rxjs/Observable";
export class CustomHttp extends Http {
constructor(backend:ConnectionBackend,
defaultOptions:RequestOptions) {
super(backend, defaultOptions)
}
request(url:string | Request, options?:RequestOptionsArgs):Observable<Response> {
return super.request(url, options).catch((res: Response) => this.handleResponseError(res));
}
get(url:string, options?:RequestOptionsArgs):Observable<Response> {
return super.get(url, options).catch((res: Response) => this.handleResponseError(res));
}
// ...長いので省略
//
// Here's to handle error stuff
//
private handleResponseError(res:Response) {
if (res.status === 401) {
// do something
} else if (res.status === 500) {
// do something
}
return Observable.throw(res);
}
}
全体像はこちらを見てください。
custom-http.service.ts
main.ts
import 'rxjs/Rx';
import {bootstrap} from 'angular2/platform/browser';
import {provide} from "angular2/core";
import {AppComponent} from './app.component';
import {CustomHttp} from "./common/services/custom-http.service";
bootstrap(AppComponent, [
provide(Http, {
useFactory: (backend:XHRBackend, defaultOptions:RequestOptions) => {
return new CustomHttp(backend, defaultOptions)
},
deps: [XHRBackend, RequestOptions]
})
]);
⚠️
Angular2はRxJS
のAPIをWarpしているが、RxJS
のすべてのAPIを提供していない。
RsJS
のAPIをフルで利用したい場合は、main.ts
でRxJS
を直接importする必要がある。
main.ts
import 'rxjs/Rx';
## Conclusion
- Angualr2でもAngular1のHttpInterceptorと近いことはできる。
- ただ、少し面倒だ。
- 使えそうなもの置いておきます => [custom-http.service.ts](https://gist.github.com/mitsuruog/6f7f0ca3f546b245bccdd3ebc14375d8#file-custom-http-service-ts)