Поиск по сайту
Ctrl + K
Вопросы по Angular

Каковы применения HTTP-перехватчиков?

HTTP-перехватчики (HTTP Interceptors) в Angular — это мощный инструмент, который позволяет вам перехватывать и изменять HTTP-запросы и ответы перед их отправкой или получением. Они особенно полезны для реализации функциональности, связанной с аутентификацией, обработкой ошибок и логированием. Давайте рассмотрим основные применения HTTP-перехватчиков.

1. Аутентификация

Одно из самых распространенных применений HTTP-перехватчиков — это добавление токена аутентификации (например, JWT) в заголовок каждого запроса. Это позволяет вам не заботиться о добавлении токена в каждом сервисе.

Пример:

import {Injectable} from '@angular/core';
import {HttpInterceptor, HttpRequest, HttpHandler, HttpEvent} from '@angular/common/http';
import {Observable} from 'rxjs';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const token = localStorage.getItem('token'); // получаем токен из local storage
        if (token) {
            const cloned = req.clone({
                setHeaders: {Authorization: `Bearer ${token}`}
            });
            return next.handle(cloned); // отправляем измененный запрос
        }
        return next.handle(req); // отправляем оригинальный запрос, если токена нет
    }
}

2. Обработка ошибок

Вы можете перехватывать ответы HTTP для обработки ошибок на одном уровне, избавляя от необходимости дублировать код в каждом сервисе.

Пример:

import {Injectable} from '@angular/core';
import {HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse} from '@angular/common/http';
import {Observable, throwError} from 'rxjs';
import {catchError} from 'rxjs/operators';

@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req).pipe(
            catchError((error: HttpErrorResponse) => {
                // Логика обработки ошибок
                console.error('HTTP Error:', error);
                return throwError(error);
            })
        );
    }
}

3. Логирование запросов

HTTP-перехватчики могут также использоваться для логирования всех исходящих запросов и входящих ответов, что полезно для отладки.

Пример:

import {Injectable} from '@angular/core';
import {HttpInterceptor, HttpRequest, HttpHandler, HttpEvent} from '@angular/common/http';
import {Observable} from 'rxjs';

@Injectable()
export class LoggingInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        console.log('Request:', req);
        return next.handle(req).do(event => {
            console.log('Response:', event);
        });
    }
}

4. Модификация запросов и ответов

Можно изменять запросы или ответы, например, добавлять определенные параметры или изменять формат данных.

Регистрация HTTP-перехватчиков

Чтобы использовать перехватчики, их необходимо зарегистрировать в модуле приложения. Вы можете сделать это в файле app.module.ts:

import {HTTP_INTERCEPTORS} from '@angular/common/http';
import {AuthInterceptor} from './auth.interceptor';
import {ErrorInterceptor} from './error.interceptor';
import {LoggingInterceptor} from './logging.interceptor';

@NgModule({
    providers: [
        {provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true},
        {provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true},
        {provide: HTTP_INTERCEPTORS, useClass: LoggingInterceptor, multi: true},
    ],
})
export class AppModule {
}

Заключение

HTTP-перехватчики в Angular — это мощный инструмент для централизованного управления HTTP-запросами и ответами. Они помогают поддерживать чистоту и структуру кода, освобождая вас от необходимости повторять одинаковую логику в каждом сервисе. Используя перехватчики, вы можете сосредоточиться на бизнес-логике вашего приложения, оставляя обработку запросов и ошибок на откуп Angular.