Angular HTTP Interceptors

ஆங்குலர் HTTP இடைமறுப்பிகள் - கோரிக்கைகள் மற்றும் பதில்களை மையமாக கையாளுதல்

ஆங்குலர் HTTP இடைமறுப்பிகள்

HTTP இடைமறுப்பிகள் என்பது HttpClient குழாய்க்கோட்டில் உள்ள செயல்பாடுகள் ஆகும், அவை தலைப்புகளைச் சேர்க்க, பதிவு செய்ய, பிழைகளைக் கையாள மற்றும் மீண்டும் முயற்சிக்க உங்களை அனுமதிக்கின்றன.

HTTP இடைமறுப்பிகள் அடிப்படைகள்

கோரிக்கைகள்/பதில்களைக் கண்காணி

உலகளவில் கோரிக்கைகள் மற்றும் பதில்களைப் பார்க்கவும் அல்லது மாற்றவும்.

இடைமறுப்பி செயல்பாடு

ஒவ்வொரு கோரிக்கை/பதிலுக்கும் இயங்கும் HttpClient குழாய்க்கோட்டில் உள்ள ஒரு செயல்பாடு.

பொதுவான பயன்பாடுகள்

அங்கீகார தலைப்புகள், பிழை கையாளுதல், மீண்டும் முயற்சிகள், பதிவு செய்தல்.

HTTP இடைமறுப்பிகள் எடுத்துக்காட்டு

import { provideHttpClient, withInterceptors } from '@angular/common/http';

const authInterceptor = (req, அடுத்தது) => {
  const cloned = req.clone({ setHeaders: { Authorization: 'Bearer token' } });
  return அடுத்தது(cloned);
};

bootstrapApplication(App, {
  providers: [provideHttpClient(withInterceptors([authInterceptor]))]
});

தொடர்புடையவை:

  • HttpClient மற்றும் சேவைகளைப் பார்க்கவும்.
  • சிறிய, ஒற்றை-நோக்கு இடைமறுப்பிகளைச் சங்கிலியாக இணைக்கவும்.
  • கூறுகளை மெல்லியதாக வைத்திருக்க மையமாக பிழைகளைக் கையாளவும்.

இடைமறுப்பியை எழுதுதல்

அடிப்படை இடைமறுப்பி எடுத்துக்காட்டுகள்

// எளிய பதிவு இடைமறுப்பி
const logInterceptor = (req, அடுத்தது) => {
  console.log(req.method, req.url);
  return அடுத்தது(req);
};

provideHttpClient(withInterceptors([logInterceptor]));

// வகைப்படுத்தப்பட்ட இடைமறுப்பி
import { HttpInterceptorFn } from '@angular/common/http';

const typedInterceptor: HttpInterceptorFn = (req, அடுத்தது) => {
  // எடுத்துக்காட்டு: ஒரு தலைப்பைச் சேர்க்கவும்
  return அடுத்தது(req.clone({ setHeaders: { 'X-Trace': 'demo' } }));
};

provideHttpClient(withInterceptors([typedInterceptor]));

முழுமையான எடுத்துக்காட்டு

import { bootstrapApplication } from '@angular/platform-browser';
import { Component, inject } from '@angular/core';
import { HttpClient, provideHttpClient, withInterceptors, HttpResponse, HttpRequest, HttpHandlerFn } from '@angular/common/http';
import { of } from 'rxjs';
import { JsonPipe } from '@angular/common';

const logInterceptor = (req: HttpRequest<any>, அடுத்தது: HttpHandlerFn) => {
  console.log('Request', req.method, req.url);
  return அடுத்தது(req);
};

// வெளிப்புற வலையமைப்பு இல்லாமல் டெமோ இயங்க Mock இடைமறுப்பி
const mockInterceptor = (req: HttpRequest<any>, அடுத்தது: HttpHandlerFn) => {
  if (req.method === 'GET' && req.url.includes('jsonplaceholder.typicode.com/todos/1')) {
    const body = { id: 1, title: 'Mocked todo', completed: false };
    return of(new HttpResponse({ status: 200, body }));
  }
  return அடுத்தது(req);
};

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [JsonPipe],
  template: `
    <h3>HTTP Interceptor</h3>
    <button (click)="load()">Load</button>
    <pre>{{ data | json }}</pre>
  `
})
class App {
  #http = inject(HttpClient);
  data: any;
  load() {
    this.#http.get('https://jsonplaceholder.typicode.com/todos/1').subscribe(r => this.data = r);
  }
}

bootstrapApplication(App, { providers: [provideHttpClient(withInterceptors([mockInterceptor, logInterceptor]))] });

எடுத்துக்காட்டு விளக்கம்:

  • withInterceptors([fn]): ஒவ்வொரு கோரிக்கை மற்றும் பதிலுக்கும் இயங்கும் ஒன்று அல்லது அதற்கு மேற்பட்ட இடைமறுப்பி செயல்பாடுகளைப் பதிவு செய்கிறது.
  • இடைமறுப்பி fn (req, அடுத்தது): விருப்பமாக கோரிக்கையை மாற்ற req.clone(...) பயன்படுத்தவும், பின்னர் தொடர அடுத்தது(req) அழைக்கவும்.
  • provideHttpClient(...): HttpClient ஐ இயக்குகிறது மற்றும் துவக்கத்தில் இடைமறுப்பிகளை உருவாக்குகிறது.

குறிப்புகள்:

  • வரிசை: கோரிக்கைகள் வழங்கப்பட்ட வரிசையில் பாய்கின்றன; பதில்கள் தலைகீழ் வரிசையில் மீள்கின்றன.
  • மாற்ற முடியாத: HttpRequest ஐ மாற்ற req.clone({...}) பயன்படுத்தவும்.
  • ஒற்றை-நோக்கம்: கவனம் செலுத்திய இடைமறுப்பிகளை withInterceptors([...]) உடன் உருவாக்கவும்.

பிழை கையாளுதல் மற்றும் மீண்டும் முயற்சிகள்

HTTP பிழை கையாளுதலை ஒரு இடைமறுப்பியில் மையப்படுத்தவும்.

பயனர் நட்பு செய்திகளுக்கு பிழைகளை மேப்பிங் செய்வதன் மூலம் கூறுகளை எளிமையாக வைத்திருக்கவும்.

backoff உடன் மீண்டும் முயற்சி தர்க்கத்தை கவனமாகச் சேர்க்கவும்; மீண்டும் முயற்சிக்க முடியாத பிழைகளை (எ.கா., 4xx) மீண்டும் முயற்சிக்கத் தவிர்க்கவும்.

பிழை கையாளுதல் இடைமறுப்பி

import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';

const errorInterceptor = (req, அடுத்தது) => அடுத்தது(req).pipe(
  catchError(err => {
    // பிழையை மேப்பிங்/பதிவு/அறிவிப்பு
    console.error('HTTP Error:', err);
    // பயனர் நட்பு செய்திக்கு மேப்பிங்
    const userMessage = 'Something went wrong. Please try again.';
    return throwError(() => new Error(userMessage));
  })
);

provideHttpClient(withInterceptors([errorInterceptor]));

வழிகாட்டுதல்கள்:

  • பயனர் நட்பு செய்திகளுக்கு பிழைகளை மேப்பிங் செய்ய இடைமறுப்பியில் catchError பயன்படுத்தவும்.
  • retry அல்லது retryWhen உடன் backoff பயன்படுத்தி idempotent கோரிக்கைகளை மீண்டும் முயற்சிக்கவும்; 4xx பிழைகளை மீண்டும் முயற்சிக்கத் தவிர்க்கவும்.
  • டோக்கன்களைப் புதுப்பிப்பதன் மூலம் அங்கீகாரத்தை (401) கையாளவும் அல்லது திருப்பி அனுப்பவும்; பல இடங்களிலிருந்து வழிசெலுத்துவதைத் தவிர்க்கவும்-அதை மையப்படுத்தவும்.
பிழை வகை இடைமறுப்பி செயல் பரிந்துரை
401 Unauthorized டோக்கனைப் புதுப்பிக்கவும் அல்லது உள்நுழைவு பக்கத்திற்குத் திருப்பி அனுப்பவும் குறிப்பிட்ட புதுப்பிப்பு இடைமறுப்பி பயன்படுத்தவும்
403 Forbidden பயனருக்கு அனுமதி மறுக்கப்பட்டது என்பதைக் காட்டு பயனர் நட்பு செய்தியுடன் பிழையை மேப்பிங் செய்யவும்
404 Not Found செல்லுபடியாகாத வளத்தைக் காட்டு குறிப்பிட்ட 404 கையாளுதல்
500 Server Error சர்வர் பிழையைக் காட்டி மீண்டும் முயற்சிக்கவும் GET கோரிக்கைகளுக்கு மட்டுமே மீண்டும் முயற்சிக்கவும்
Network Error இணைய இணைப்பு இல்லாததைக் காட்டு offline நிலையைக் கையாளும் இடைமறுப்பி

வரிசைப்படுத்துதல் & உருவாக்கம்

சிறிய இடைமறுப்பிகளை உருவாக்கவும் மற்றும் அவை இயங்கும் வரிசையைக் கருத்தில் கொள்ளவும்.

கோரிக்கைகள் வழங்கப்பட்ட வரிசையில் பாய்கின்றன; பதில்கள் தலைகீழ் வரிசையில் மீள்கின்றன.

இடைமறுப்பி வரிசை எடுத்துக்காட்டு

const auth = (req, அடுத்தது) => 
  அடுத்தது(req.clone({ setHeaders: { Authorization: 'Bearer ...' } }));

const log = (req, அடுத்தது) => { 
  console.log('Request to:', req.url); 
  return அடுத்தது(req); 
};

// கோரிக்கை வரிசை: auth -> log
// பதில் வரிசை: log -> auth
provideHttpClient(withInterceptors([auth, log]));

வரிசை

கோரிக்கைகள் வழங்கப்பட்ட வரிசையில் இடைமறுப்பிகள் வழியாகப் பாய்கின்றன; பதில்கள் தலைகீழ் வரிசையில் மீள்கின்றன.

ஒற்றை-நோக்கம்

இடைமறுப்பிகளை கவனம் செலுத்தியதாக வைத்திருக்கவும் (அங்கீகாரம், பதிவு, பிழை கையாளுதல்) மற்றும் withInterceptors([...]) உடன் உருவாக்கவும்.

மாநிலமில்லாத

இடைமறுப்பிகளுக்குள் மாற்றக்கூடிய மாநிலத்தை சேமிக்கத் தவிர்க்கவும்; தூய செயல்பாடுகள் மற்றும் உட்செலுத்தப்பட்ட சேவைகளைப் பயன்படுத்தவும்.

பாதுகாப்பு குறிப்புகள்:

  • மீண்டும் முயற்சி பாதுகாப்பு: idempotent முறைகளை மட்டுமே மீண்டும் முயற்சிக்கவும் (எ.கா., GET/HEAD).
  • அனுமதி இல்லாத முறைகளை மீண்டும் முயற்சிக்கத் தவிர்க்கவும்: நீங்கள் idempotency விசைகளைப் பயன்படுத்தாவிட்டால் non-idempotent முறைகளை மீண்டும் முயற்சிக்கத் தவிர்க்கவும்.

ஜாஸிஃப் குழு சிறந்த பயிற்சிகள்:

  • தனி கவனத்துடன் இடைமறுப்பிகளைப் பிரிக்கவும்: ஒரு இடைமறுப்பி = ஒரு பொறுப்பு.
  • பிழை கையாளுதலை மையப்படுத்தவும்: அனைத்து HTTP பிழைகளும் ஒரு இடைமறுப்பி வழியாகச் செல்லட்டும்.
  • வரிசையைத் திட்டமிடுங்கள்: அங்கீகாரம் → பதிவு → பிழை கையாளுதல் போன்ற தர்க்கரீதியான வரிசையைப் பயன்படுத்தவும்.
  • மாற்றும் முடியாத கோரிக்கைகள்: எப்போதும் கோரிக்கைகளை மாற்ற req.clone() பயன்படுத்தவும்.

பொதுவான இடைமறுப்பி முறைகள்

அங்கீகார இடைமறுப்பி

அனைத்து வெளிச்செல்லும் கோரிக்கைகளுக்கும் டோக்கன்களை இணைக்கிறது.

req.clone({setHeaders: {Authorization}})

மீண்டும் முயற்சி இடைமறுப்பி

நெட்வொர்க் தோல்விகளுக்காக GET கோரிக்கைகளை மீண்டும் முயற்சிக்கிறது.

retryWhen(errors => errors.pipe(delay(1000), take(3)))

பதிவு இடைமறுப்பி

கோரிக்கை/பதில் மெட்ரிக்ஸைக் கண்காணிக்கிறது.

console.log(`${req.method} ${req.url}`)

பிழை கையாளுதல் இடைமறுப்பி

HTTP பிழைகளை பயனர் நட்பு செய்திகளுக்கு மேப்பிங் செய்கிறது.

catchError(err => { /* handle */ })

பயிற்சி

எந்த வரிசையில் பதில்கள் HTTP இடைமறுப்பிகள் வழியாகச் செல்கின்றன?

சரியான பதிலைத் தேர்ந்தெடுக்கவும்:

பதிவு செய்த வரிசையின் தலைகீழ் வரிசை
✓ சரி! பதில்கள் இடைமறுப்பிகள் வழியாக பதிவு செய்யப்பட்ட வரிசையின் தலைகீழ் வரிசையில் பயணிக்கின்றன. கோரிக்கைகள் முன்னோக்கிச் சென்றால், பதில்கள் பின்னோக்கிச் செல்கின்றன.
கோரிக்கைகள் போன்ற அதே வரிசை
✗ தவறு! பதில்கள் கோரிக்கைகள் போன்ற அதே வரிசையில் செல்லாது. அவை ஒரு ஸ்டாக் போல செயல்படுகின்றன: கோரிக்கைகள் முன்னோக்கிச் செல்கின்றன, பதில்கள் பின்னோக்கிச் செல்கின்றன.
சீரற்ற வரிசை
✗ தவறு! இடைமறுப்பி செயல்பாடு வரிசை சீரற்றது அல்ல. இது பயன்பாட்டின் வடிவமைப்பு மூலம் தீர்மானிக்கப்படுகிறது மற்றும் எப்போதும் கணிக்கக்கூடியதாக உள்ளது.
அடுத்தது