Одним из направлений мы приближались это на нашей команде, реализуя класс клиента API. Этот API-клиент обертывает исходную службу Http.
Идея заключается в том, что, поскольку службе Http производит наблюдаемые вы можете легко расширить свое поведение путем добавления операторов как map
, flatMap
и catch
операторов к исходному наблюдаемому производится службой Http.
Я думаю, вы найдете этот пример полезной отправной точкой для устранения проблемы, с которой вы сталкиваетесь.
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;
});
}
}
См http://stackoverflow.com/questions/36599523/angular-2-route-to-404-page-when-route-param-is-invalid/36609006#36609006 –
@ GünterZöchbauer Безразлично» t ответ на мой вопрос об использовании маршрутизатора в сервисе – Viktor
Не знаете, почему. Если вы введете конструктор маршрутизатора (частный http: Http, private router: Router) {} ', вы сможете его использовать. См. Также ссылку ниже вопроса. –