我正在尝试解决另一个Angular问题-您能帮我吗?在我的组件中,我有一个登录功能-像这样:
@RestControllerAdvice
public class ExceptionHandlerRest{
private Logger logger=LoggerFactory.getLogger(getClass());
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleException(Exception ex){
logger.error("System Error", ex);
SimpleResponse=new SimpleResponse(ex.getMessage(),"Error code 001"));
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
我的服务功能如下:
public class SimpleResponse{
String technicalMessage,userMessage;
//public getters and setters
}
现在,我已经完全按照Angular文档中的描述实现了用于错误处理的功能。我已经将该功能外包了,看起来像这样:
onLogin() {
if (this.loginForm.valid) {
const email = this.loginForm.get(['email']).value;
const password = this.loginForm.get(['password']).value;
this.ls.login(email, password).subscribe(
result => {
this.saveToken(result);
},
error => {
this.errorMessage = error;
this.loginForm.reset();
}
);
} else {
this.updateErrorMessage();
}
}
但是如何访问API响应的正文? login(email: string, password: string): Observable<string> {
const apiUrl = environment.apiHostLumen + '/admin/login?email=' + email + '&password=' + password;
const headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });
const options = new RequestOptions({ headers: headers });
return this.http.get(apiUrl, options).pipe(
retry(3),
map(res => res.json()),
map(data => {
return data.token;
}),
catchError(this.ehs.handleError('login'))
);
}
始终是不确定的。我只能访问handleError<T> (operation = 'operation', result?: T) {
return (error: HttpErrorResponse): Observable<T> => {
const userMessage = error.message;
return throwError(userMessage);
};
}
代码和error.message
。如果API返回的错误代码与status
不同,该如何访问响应正文?
非常感谢
答案 0 :(得分:1)
您可以为此使用HttpInterceptor
。由此,您可以在一个类中处理所有http错误。您可以在官方角逐中阅读更多关于Intercepting requests and responses的信息。
通过使用intercept
方法,您可以拦截每个请求和响应。
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next
.handle(req)
.pipe(catchError(err => {
if (err instanceof HttpErrorResponse) {
this.onError(err);
}
return throwError(err);
}));
}
private onError(response: HttpErrorResponse): void {
const status: number = response.status;
const serverErrorMessage = response.error;
switch(status) {
case 400:
console.log("Bad request"); //or you can print the serverErrorMessage
case 404:
console.log("Not found");
}
}
答案 1 :(得分:1)
您可以执行error.error
,这应该会给您来自服务器的错误响应。
handleError<T> (operation = 'operation', result?: T) {
return (error: HttpErrorResponse): Observable<T> => {
const userMessage = error.error; // should give error body
return throwError(userMessage);
};
}
来源:
https://angular.io/api/common/http/HttpErrorResponse
Accessing HTTP Error Response Body from HttpInterceptor in Angular
答案 2 :(得分:1)
我发现了错误。非常感谢您的帮助!我将错误类型重命名为linkGen
,并使用pageGen
实际上可以正常访问响应正文。我不知道该怎么忽略...
谢谢!看来可行!