在使用HttpClient
的Angular服务中,我创建了一个从POST
返回原始HTTP响应的方法:
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
//observe: 'response'
}),
observe: 'response' as 'body'
};
forgotLogin(requestData: PUMRequestData): Observable<HttpResponse<string>> {
return this.http.post<HttpResponse<string>>("http://...", requestData, this.httpOptions);
然后在我的组件中,我只是从原始的HTTP响应中查看状态和正文。
this.api.forgotLogin(pumRequestData).subscribe(response => {
this.hStatus = response.status;
this.hBody = response.body;
});
问题是,如果响应状态不在200
系列中,则HttpClient
会引发错误。在我的用例中,我只想获取请求状态和主体,而无论状态是什么,我都想根据组件中的状态而不是服务中的错误处理程序中的状态来决定要采取什么操作。我一直在尝试找到一种在服务中创建错误处理程序的棘手方法,该方法仅返回(Observable)HTTP
响应,但未能做到-甚至不确定这是否是正确的方法。
所以,当状态不是200系列时,如何将原始的HTTP响应返回给我的组件?
当您订阅HTTP
响应时,可以添加错误处理程序。 HttpErrorResponse
对象包括从HttpErrorResponse
继承的HttpHeaders
,status
和statusText
。
HttpResponseBase
在属性HttpResponseBase
中可用。
body
属性可用于HttpErrorResponse.error
- headers:HttpHeaders-所有响应头。
- 状态:数字-响应状态代码。
- statusText:字符串-响应状态代码的文本描述。 (不依赖于此)
- url:字符串| null-检索到的资源的URL;如果不可用,则为
HttpResponseBase
。- ok:布尔值-状态代码是否在2xx范围内。
HttpErrorResponse
错误处理程序也可以放置在RXJS null
中,因此可以在订阅this.api.forgotLogin(pumRequestData).subscribe(
response => {
this.hStatus = response.status;
this.hBody = response.body;
},
(error: HttpErrorResponse) => {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
console.error('An error occurred:', error.error.message);
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
console.error(`Backend returned code ${error.status}, ` +
`body was: ${error.error}`);
}
}
);
请求之前将其嵌入。
pipe
请参见Angular HTTP
文档:this.http.get<Object>(full_url, options).pipe(catchError((error: HttpErrorResponse) => {
// Process error here, such as logging.
...
return throwError(error)
}))