Bir yönü bir API istemcisi sınıf uygulama gereğidir. Bu API istemcisi, orijinal Http hizmetini sarar.
fikri Http hizmet gözlenebilirlerini üretir beri kolayca Http hizmeti tarafından üretilen orijinal gözlemlenebilir için map
, flatMap
ve catch
operatörleri gibi ekleyerek operatörler tarafından davranışını uzatabilirsiniz olmasıdır.
Bu örneğe sahip olduğunuz sorunu gidermek için yararlı bir başlangıç noktası bulacağınızı düşünüyorum.
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;
});
}
}
Bkz http://stackoverflow.com/questions/36599523/angular-2-route-to-404-page-when-route-param-is-invalid/36609006#36609006 –
@ GünterZöchbauer o kokan t Hizmete yönlendiriciyi kullanma hakkındaki sorumu yanıtla – Viktor
Neden olmadığından emin değilsiniz. Eğer yönlendirici 'constructor (özel http: Http, özel yönlendirici: Router) {}' enjekte ederseniz onu kullanabilmeniz gerekir. Ayrıca sorunun altındaki bağlantıya bakınız. –