新しいHttpClientModule
を使用して、Angular 4.3サービスから.NET Core WebApiによって返されたエラーを処理しようとしています。角度4.3 HttpClient:キャッチwebapiエラーレスポンスボディ
次のように私は、httpリクエストを作ってるんだ:
postUser(model: IPostUser): Observable<IUser> {
return this.http.post<IUser>(this.originUrl + '/api/registry', model)
.catch((reason: any) => this.handleError(reason));
}
handleError
方法は次のとおりです。
private handleError(error: HttpErrorResponse | any): ErrorObservable {
// in a real world app, we might use a remote logging infrastructure
let errStatus: string;
let errMsg: string;
if (error instanceof HttpErrorResponse) {
try {
const body: any = error.error || error;
const err: string = body.message || JSON.stringify(body);
errStatus = `${error.status} - ${error.statusText || ''}`;
errMsg = `${err}`;
if (error.status === 0) {
errMsg = 'Si é verificato un errore. Si prega di riprovare più tardi.';
} else if (error.status === HttpStatusCodes.UNAUTHORIZED || error.status === HttpStatusCodes.FORBIDDEN) {
errMsg = 'Non hai effettuato l\'accesso.';
}
} catch (ex) {
errMsg = 'Si é verificato un errore. Si prega di riprovare più tardi.';
}
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errStatus + ': ' + errMsg);
this.toastrService.error(errMsg, 'Errore');
return Observable.throw(errMsg);
}
そしてWEBAPIコントローラのアクションは、以下のセキュリティチェックを行います
var user = await _userManager.FindByIdAsync(model.Id);
if (user == null)
return NotFound("Utente non trovato.");
if ((await _userManager.FindByNameAsync(model.UserName)) != null)
return BadRequest("Esite già un utente con questo Username.");
else if ((await _userManager.FindByEmailAsync(model.Email)) != null)
return BadRequest("Esite già un utente con questa Email.");
else if ((await _userManager.Users.SingleOrDefaultAsync(u => u.TaxCode == model.TaxCode)) != null)
return BadRequest("Esite già un utente con questo Codice Fiscale.");
したがって、どのユーザーがサーバーに投稿しようとするかに応じて、サーバーはNotFound o r BadRequestは、メッセージを含むオブジェクトである本文で再配置します。
そのWEBAPIアクション原因に悪いの呼び出しこのエラー:
undefined: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
私はエラーレスポンスボディをキャッチするHttpInterceptorを使用することを試みた:
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(private router: Router) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).do((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// do stuff with response if you want
}
}).catch((error: any) => {
if (error instanceof HttpErrorResponse) {
let x = error;
if (error.status === HttpStatusCodes.BAD_REQUEST || error.status === HttpStatusCodes.NOT_FOUND) {
return Observable.throw(error);
}
}
})
}
}
しかし、迎撃器でも、エラーはまだ同じですメソッドの直後にpost
呼び出しAngularサービスでは、私のカスタムエラーオブジェクトではなく、上記のTypeError
例外が呼び出されました。
サーバーからBadRequest/NotFoundエラー応答を取得し、エラー応答本体を正しく取得するにはどうすればよいですか?
ありがとうございました!