Не удается получить значения заголовков запросов из перехватчика Angular HTTP

#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';
    }
  

Приветствия!