Một hướng chúng tôi đã tiếp cận này nhóm của chúng tôi là bằng cách thực hiện một lớp khách hàng API. Ứng dụng API này kết thúc tốt đẹp dịch vụ Http gốc.
Ý tưởng là kể từ khi dịch vụ Http sản xuất quan sát bạn có thể dễ dàng mở rộng hành vi của nó bằng cách khai thác thêm như map
, flatMap
và catch
khai thác các quan sát ban đầu được tạo ra bởi các dịch vụ Http.
Tôi nghĩ bạn sẽ thấy ví dụ này là điểm khởi đầu hữu ích để khắc phục sự cố bạn đang gặp phải.
import { ApiRequestOptions } from './api-request-options.service';
import { Http, Response, RequestOptions, ResponseContentType } from '@angular/http';
import 'rxjs/add/observable/zip';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Rx';
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
@Injectable()
export class ApiClient {
// PLease note, the API request options service is a helper that we introduced
// to generate absolute URLs based on settings in the client.
// I did not include it here for brevity.
constructor(private router: Router, private http: Http, private requestOptions: ApiRequestOptions) {
}
get<TResponse>(path: string, queryStringParams?: any): Observable<TResponse> {
let self = this;
return Observable.zip(
this.requestOptions.absoluteUrlFor(path, queryStringParams),
this.requestOptions.authorizedRequestOptions()
).flatMap(requestOpts => {
let [url, options] = requestOpts;
return self.http.get(url, options);
}).catch(response => {
if (response.status === 401) {
self.router.navigate(['/login']);
}
return response;
}).map((response: Response) => <TResponse>response.json());
}
post<TResponse>(path: string, body: any): Observable<TResponse> {
let self = this;
return Observable.zip(
this.requestOptions.absoluteUrlFor(path),
this.requestOptions.authorizedRequestOptions()
).flatMap(requestOpts => {
let [url, options] = requestOpts;
return self.http.post(url, body, options);
}).catch(response => {
if (response.status === 401) {
self.router.navigate(['/login']);
}
return response;
}).map((response: Response) => <TResponse>response.json());
}
put<TResponse>(path: string, body: any): Observable<TResponse> {
let self = this;
return Observable.zip(
this.requestOptions.absoluteUrlFor(path),
this.requestOptions.authorizedRequestOptions()
).flatMap(requestOpts => {
let [url, options] = requestOpts;
return self.http.put(url, body, options);
}).catch(response => {
if (response.status === 401) {
self.router.navigate(['/login']);
}
return response;
}).map((response: Response) => {
if (response.status === 200) {
return <TResponse>response.json();
} else {
return null;
}
});
}
delete(path: string): Observable<Response> {
let self = this;
return Observable.zip(
this.requestOptions.absoluteUrlFor(path),
this.requestOptions.authorizedRequestOptions()
).flatMap(requestOpts => {
let [url, options] = requestOpts;
return self.http.delete(url, options);
}).catch(response => {
if (response.status === 401) {
self.router.navigate(['/login']);
}
return response;
});
}
}
Nguồn
2017-01-10 11:56:10
Xem http://stackoverflow.com/questions/36599523/angular-2-route-to-404-page-when-route-param-is-invalid/36609006#36609006 –
@ GünterZöchbauer nó doesn' t trả lời câu hỏi của tôi về việc sử dụng bộ định tuyến trong dịch vụ – Viktor
Không chắc chắn lý do. Nếu bạn tiêm bộ tạo 'router (private http: Http, private router: Router) {}' bạn sẽ có thể sử dụng nó. Xem thêm liên kết bên dưới câu hỏi. –