我已经将此http调用方法进行了编码:
public exists(id: string): Observable<boolean> {
const buildURL = () => map((userId: string) => this.buildIdURL(userId));
const buildResponse = () => map(() => true);
const onErrorGetDetails = <T>() => catchError<T, boolean>((error: Response) => this.handleError(error));
const makeRequest = () => switchMap((url: string) => this.authHttp.head(url));
return Observable.of(id)
.pipe(
buildURL(),
makeRequest(),
buildResponse(),
onErrorGetDetails()
);
}
因此,我正在尝试处理以下响应:
Observable.of(false)
Observable.throw(error)
。有什么想法吗?
答案 0 :(得分:1)
我希望我已经了解您的需求。您从error
方法获得的catchError
应该包含状态代码。因此,您可以正确处理它。
我没有进行适当的搜索,但是我记得使用HttpErrorResponse
而不是Response
来获取有关HTTP响应的更多信息。
几个月前,我写了类似的东西:
const onErrorGetDetails = <T>() => catchError<T, boolean>((error: HttpErrorResponse) => {
if (error.status === 404) {
return of(false)
}
return throwError(error)
答案 1 :(得分:0)
要完成此操作,您需要设置一个名为
的选项{observe: 'response'}
这使您可以读取http呼叫的响应状态。 因此,http调用将是:
makeCall(): Observable<any> {
return this.http.get('uri', {observe: 'response'});
}
当您要订阅时,只需检查错误状态,即使不进行订阅,也可以检查错误状态,只需管道并使用map或catchError并检查响应。
这是我如何在jwt验证中实现此示例:
return this.auth.validateJwt().pipe(
map( (response) => {
if (response.status === 200) {
return true;
}
}),
catchError((err: Response) => {
this.handleError('authentication');
if (err.status === 200) {
return of(true);
}
return of(false);
}),
first()
);
我映射响应错误以查看代码是否为200,映射响应意味着服务器将返回某些内容,请记住我们将收到完整的响应,因此响应将由标头,正文响应组成,其中body是数据。但是,如果服务器处于脱机状态,或者我在代码上键入错误的url,则会捕获该错误,因为即使没有主体,我仍然会有响应。
角度文档:https://angular.io/guide/http#reading-the-full-response