Угловой HttpClient получает и обрабатывает 302/307 код ответа;отключить перенаправление - PullRequest
1 голос
/ 01 ноября 2019

У меня есть следующий сервис для моего компонента:

@Injectable({
  providedIn: 'root',
})
export class MyService {
    constructor(private httpClient: HttpClient ) { }
}
someFunction() {
   this.httpClient.post(url, data, options)
}

У меня также есть HttpInterceptor, как показано ниже:

@Injectable({
  providedIn: 'root'
})
export class HttpInterceptorService implements HttpInterceptor {
  constructor() {}

  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    return next.handle(req).do(
      (event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          console.log('############### event status: ', event.status);
        }
        console.log('########### event is: ', event);
      },
      (err: any) => {
        if (err instanceof HttpErrorResponse) {
          console.log('HTTP error status is: ', err.status);
        } 
        console.log('error is: ', err);
      }
    );
  }
}

Теперь мой почтовый вызов может быть получентри типа кодов ответа: либо 200, либо 302, либо 307. Теперь в случаях, когда я получаю 200 все работает нормально. Однако, когда я получаю 302 или 307, значение по умолчанию HttpClient продолжает следовать за Location в ответе вместо того, чтобы дать мне контроль. URL-адрес перенаправления является обновленным URL-адресом, но для него требуется другой тип обработки (GET вместо POST и добавлены некоторые дополнительные параметры).

В случае таких ошибок, как 400, я правильно получаю ошибкув моем Interceptor блоке catch.

Есть ли способ отключить перенаправление HTTP и обработать перенаправление в моем коде?

1 Ответ

0 голосов
/ 02 ноября 2019

Взято из Документы Mozilla: коды состояния ответа HTTP :

Коды состояния ответа HTTP указывают, был ли конкретный запрос HTTP успешно выполнен. Ответы сгруппированы в пять классов:

Информационные ответы (100–199),

Успешные ответы (200–299),

Перенаправления (300–399),

Ошибки клиента (400–499),

и Ошибки сервера (500–599).

Как видите, 3xx Коды состояния HTTP НЕ с ошибками, но перенаправляют. Только 4xx и 5xx Коды состояния HTTP считаются ответами об ошибках . Вот почему, когда ваше угловое приложение получило ответ 4xx, блок перехвата вашего перехватчика правильно его обработал.


Взято из Документы Mozilla: Перенаправления в HTTP :

Принцип

В HTTP перенаправление инициируется сервером путем отправки специальных ответов на запрос: перенаправления. HTTP-перенаправления - это ответы с кодом состояния 3xx. Браузер при получении ответа на перенаправление использует предоставленный новый URL-адрес и немедленно загружает его : в большинстве случаев перенаправление прозрачно для пользователя, за исключением небольшого снижения производительности.

К сожалению, когда браузеры получают ответ 3xx, они проявляют инициативу и немедленно запрашивают URI, определенный в заголовке Location. Поэтому у вас нет способа перехватить ответ и что-то с ним сделать.


Если API принадлежит вам, вам будет проще просто изменить его, чтобы он возвращалдругой код состояния HTTP. Вы упомянули 302 возвращает «обновить URL». Если вы используете JWT и пытаетесь обновить токены, было бы проще вернуть 400: BAD REQUEST или 401: UNAUTHORIZED и позволить дескриптору блока ошибок вашего перехватчика вызвать URL-адрес обновления.

Если APIэто кто-то другой, тогда рассмотрите возможность изменения дизайна / потока приложений Angular для обработки ответа на перенаправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...