#angular #httpclient
#angular #httpclient
Вопрос:
Методы POST и GET работают отлично, но метод PUT не работает.
У меня есть компонент с этой функцией для обновления данных альбома через подписку:
onChangeTitle() {
this.album.name = this.titleInput;
const albumToEdit: IAlbumEdit = {
'name': this.album.name,
'description': this.album.description,
'public': this.album.public
};
this.albumService.putAlbum(this.album.id, albumToEdit).subscribe(
album => {
this.album = album;
},
error => {
this.handleError('no se ha podido modificar el álbum: ' error);
this.titleInput = this.album.name;
}
);
}
У сервиса есть эта функция, которая возвращает наблюдаемое:
putAlbum(id, album: IAlbumEdit): Observable<IAlbum> {
return this.http.put<IAlbum>(`${AppSettings.API_URL}/album/${id}`, album);
}
Это действительно просто, но я не понимаю, почему этот метод httpclient put не запускается (я вижу в сетевом мониторе в Firefox, что запускается любой put).
Более того, у меня есть перехватчик для добавления заголовка авторизации, но он не выполняется с помощью метода PUT.
Мой перехватчик — это:
export class JwtInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// add authorization header with jwt token if available
console.log('intercept');
const currentUser = JSON.parse(localStorage.getItem('currentUser'));
if (currentUser amp;amp; currentUser.token) {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${currentUser.token}`
}
});
}
console.log(request);
return next.handle(request);
}
}
Комментарии:
1. Вы уверены, что
onChangeTitle
метод вызван? Откуда вызывается этот метод?2. Да, потому что журналы. Этот метод вызывается при изменении входных данных. Я уверен, что вызывается служба методов, но перехват не вызывается, и PUT никогда не запускается.
3. Пытались ли вы отключить перехватчик, чтобы убедиться, что это не источник вашей проблемы?
4. Я только что попробовал. С отключенным перехватчиком работает… по крайней мере, запрос PUT запущен.
5. пожалуйста, проверьте вкладку network в браузере. Я думаю, что CORS в этом случае не обрабатывается должным образом на стороне сервера. Один несвязанный совет, который может быть полезен: вы можете сделать что-то вроде
return next.handle(request).pipe(tap(item => console.log('next', item), err => console.log('error', err)))
для регистрации результата внутри interceptor
Ответ №1:
Проблема была исправлена. Проблема заключалась в том, что я импортировал HTTP_INTERCEPTOR более чем в один модуль. Я исправил проблему, импортируя его только в app.module.ts.