#angular #angular-http-interceptors
#угловой #угловые http-перехватчики
Вопрос:
В приложении Angular я использую перехватчик для ввода токена (при необходимости) в заголовки запроса. Мне также нужно, чтобы он изменил Content-Type
заголовок на соответствующий. По умолчанию это должно быть application/json
, но есть вызов, который должен загрузить ZIP-файл, поэтому я хочу оставить Content-Type
заголовок как есть (для этих случаев это что-то вроде: Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvamnUWepE840OEuq
). Я использую этот код:
intercept (req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let usr = this.userService.getActualUser();
let confirmationToken = '';
let credentials = false;
let contentType = 'application/json';
// Check if the incoming request has an specific content type header
if (req.headers.has('Content-Type')) {
contentType = req.headers.get('Content-Type');
}
// ETC
}
Проблема в том, что req.headers.has('Content-Type')
всегда возвращается false
, поэтому я устанавливаю неправильный тип, и вызов завершается с ошибкой. Что я делаю не так?
Заранее спасибо!
Ответ №1:
Я полагаю, что содержимое вашей формы является экземпляром объекта FormData? Если это так,
if(req.body instanceof FormData)
Эта проверка может помочь вам или дать некоторые подсказки, если вы не можете получить доступ к заголовкам. Или, может быть, вы могли бы даже погрузиться глубже и проверить req.body
объект, чтобы выполнить более конкретную проверку.
Ответ №2:
Во время вашего запроса вы ожидаете увидеть content-type
, но вы не увидите, если не укажете это напрямую.
Если у вас есть это в вашем запросе, вы увидите тип содержимого.
return this.http.get(this.ENDPOINT, {
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
})
Однако это может быть излишним.
Другим возможным решением является проверка типа экземпляра тела, а затем соответствующая настройка заголовков
if (req.body instanceof FormData) {
contentType = 'multipart/form-data';
}
Комментарии:
1. Привет! Я попробовал это решение, но вызов заканчивается сообщением об ошибке
422 Unprocessable Entity
. Я думаю, это потому, что он ожидаетboundary
значение… Вы знаете, как я мог бы получить это значение? Спасибо!2. Вы указали мне правильное направление, нужная мне логика на самом деле была довольно простой, но сегодня мне нужно было больше кофе, чтобы понять это 🙂
3. если мой ответ соответствует вашему первоначальному вопросу, пожалуйста, проголосуйте
Ответ №3:
Следуя вашим советам, я придумал очень простое решение, то есть оставить Content-Type
заголовок как есть, если тело запроса является данными формы, а для остальных задано как JSON. Что-то вроде:
if(!(req.body instanceof FormData)) {
contentType = 'application/json';
}
Приветствия!