Здесь я подготовил макет , чтобы вы могли играть
По сути, это макет серверного вызова, перехватывающего некоторые http-запросы с компонентом 'FakeBackendInterceptor'. Там я имитирую неавторизованный ответ, если вы отправляете запрос на конечную точку «/ protected».
Единственный компонент для запуска приложения - HelloComponent, который вызывает сервис get и post для имитации как авторизованных, так и не санкционированных вызовов.
В конце концов, вы были правы, потому что это фиксируется как ошибка. Разветвите это, чтобы вы могли попробовать что-нибудь еще. Я привык перехватывать все ошибки (или несанкционированные вызовы) в одном месте, я только что добавил компонент ErrorInterceptor, чтобы вы могли попробовать оба подхода.
Обратите внимание на объявление в app.module (порядок вопросов):
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: FakeBackendInterceptor, multi: true },
],
не забудьте добавить HttpClientModule в импорт:
imports: [ HttpClientModule, BrowserModule, FormsModule ],
Если вы не хотите использовать перехватчик:
this.service.post().subscribe(
(result) => { console.log("success", result); /*extra code*/},
(error) => {
console.log("error", error); /*extra code*/
if (error.status === 401) {
console.log("You are not authorized");
}
},
() => { console.log("Complete"); /*extra code*/ })
}
Я добавил еще один дополнительный случай, чтобы вы могли иметь дело с 401 в самой службе. Если вы отправляете запрос PUT, вы можете проверить его:
let body = new FormData();
body.set("a", 'true');
body.set("username", 'user');
body.set("password", 'password');
let headers = this.createHeaders();
console.log("calling services unauthorized PUT");
return this.http.put<any>("/protected", body, { headers, observe: "response" }).
pipe(
map(res => {
if (res.status === 400 || res.status === 401) {
throw new Error(res.body.message);
}
return res.body;
}));