「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Angular インターセプターを理解する : HTTP を超えて

Angular インターセプターを理解する : HTTP を超えて

2024 年 8 月 14 日に公開
ブラウズ:167

Angular インターセプターは、開発者がアプリケーションで HTTP リクエストと応答を処理する方法を管理するために使用できる非常に強力なツールです。これらは、ロギング、認証、エラー処理などの機能を実装する際に重要な役割を果たし、コードがより明確で保守しやすくなります。

Angular インターセプターは、Angular アプリケーションとサーバーの間のミドルウェアのように機能します。これらは、リクエストがサーバーに送信される前にインターセプトし、レスポンスがアプリケーション コンポーネントに到達する前にインターセプトします。これにより、開発者はヘッダーの追加、リクエスト/レスポンス本文の変更、ステータス コードの変更によってリクエストを変更できるようになります。

Angular プロジェクトのセットアップ

まず、Angular CLI がインストールされていることを確認してください。そうでない場合は、npm:
を使用してインストールできます。

npm install -g @angular/cli

次に、新しい Angular プロジェクトを作成します:

ng new Project_Name
cd Project_Name

次に、Angular CLI を使用して新しい HTTP インターセプターを生成します:

ng generate interceptor interceptors/interceptorName

これにより、src/app/interceptors ディレクトリに interceptorName.interceptor.ts と interceptorName.interceptor.spec.ts という 2 つのファイルが作成されます。

次に、interceptorName.interceptor.ts を開いて、インターセプターのロジックを追加します。メッセージをログに記録する例を次に示します。

import { HttpInterceptorFn } from '@angular/common/http';

export const interceptorName: HttpInterceptorFn = (req, next) => {
  console.log('HTTP Request:', req);
  return next(req);
};

次に、インターセプターを使用するには、app.config.ts を開いてプロバイダー配列に追加します。

...
import { provideHttpClient,withInterceptors } from '@angular/common/http';
import { interceptorName } from './interceptors/interceptorName.interceptor';


export const appConfig: ApplicationConfig = {
  providers: [
    ....
    provideHttpClient(
      withInterceptors([interceptorName])
    ),
  ],
};

Angular インターセプターの高度な使用例

リクエストとレスポンスのカスタム変換

インターセプターは、アプリケーションによって処理される前にリクエスト本文、ヘッダー、または応答データ形式を変更するなど、リクエストと応答のデータ変換を調整できます。

import { HttpInterceptorFn, HttpResponse } from '@angular/common/http';

export const apiInterceptor: HttpInterceptorFn = (req, next) => {
  const modifiedReq = req.clone({
    body: { title:"Modified Request Body",id: 1 },
  });
  return next(modifiedReq);
};

テストシナリオ用のモック

開発者は、テスト中にインターセプターを使用して HTTP 応答を模擬することで、ライブ バックエンド サービスに依存せずに、さまざまなサーバー状況をシミュレートできます。この方法により、さまざまなシナリオを適切に評価することが可能になります。

import { HttpInterceptorFn } from '@angular/common/http';
import { of } from 'rxjs';

export const eventLoggingInterceptor: HttpInterceptorFn = (req, next) => {
    // Mock response for testing
    if (req.url.endsWith('/test')) {
    const mockResponse = { id: 1, title: 'Test Data' };
    return of(new HttpResponse({ status: 200, body: mockResponse }));
  }
    // Pass through to actual HTTP request
    return next(req);
}

Understanding Angular Interceptors : Beyond HTTP

エラー処理と再試行のメカニズム

Angular Interceptor は、失敗したリクエストを自動的に再試行したり、ユーザー エクスペリエンスを向上させるためにエラー応答を変換したりするなど、エラー処理戦略を実装することでアプリケーションを強化します。

import { HttpInterceptorFn } from '@angular/common/http';
import { catchError,retry, throwError } from 'rxjs';

export const apiInterceptor: HttpInterceptorFn = (req, next) => {
  return next(req).pipe(
    retry(3), // Retry failed requests up to 3 times
    catchError((error) => {
      console.error('HTTP Error:', error);
      return throwError(error);
    })
  );
};

Understanding Angular Interceptors : Beyond HTTP
ここでは、インターセプターはエラーを処理する前に、失敗したリクエストを最大 3 回再試行し、リクエストを正常に完了するために複数回試行することを保証します。

インターセプターの連鎖と実行順序の制御

Angular では、開発者は複数のインターセプターをリンクし、それぞれが認証、ロギング、エラー処理などのリクエスト処理のさまざまな側面を管理できます。これらは登録された順序で実行されるため、リクエストとレスポンスを正確に変更でき、アプリケーション機能を強化するためのワークフローの柔軟な管理が保証されます。

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

// First Interceptor: Authentication
export const authInterceptor: HttpInterceptorFn = (req, next) => {
  const authReq = req.clone({
    setHeaders: {
      Authorization: `Bearer YOUR_TOKEN`
    }
  });
  return next(authReq);
};

// Second Interceptor: Logging
export const loggingInterceptor: HttpInterceptorFn = (req, next) => {
  console.log('Request URL:', req.url);
  return next(req).pipe(
    tap(event => {
      if (event instanceof HttpResponse) {
        console.log('Response Status:', event.status);
      }
    })
  );
};

// Third Interceptor: Error Handling
export const errorHandlingInterceptor: HttpInterceptorFn = (req, next) => {
  return next(req).pipe(
    retry(3),
    catchError((error) => {
      console.error('HTTP Error:', error);
      return throwError(error);
    })
  );
};

// Registering Interceptors in Angular Module

export const appConfig: ApplicationConfig = {
  providers: [
    ...
    provideHttpClient(
      withInterceptors([apiInterceptor,loggingInterceptor,errorHandlingInterceptor])
    ),
  ],
};

イベント処理と DOM インタラクション

Angular インターセプターには、Angular が処理する前に DOM イベントとインタラクションをインターセプトする機能があります。この機能により、ユーザー インタラクションのログ記録、アプリケーション全体のイベント処理ポリシーの適用、アプリケーション内でのイベント伝播前の追加の検証の実施などのタスクが可能になります。

import { HttpInterceptorFn } from '@angular/common/http';

export const eventLoggingInterceptor: HttpInterceptorFn = (req, next) => {
  document.addEventListener('click', (event) => {
    console.log('Click event intercepted:', event);
    // Additional custom event handling logic
  });
  return next(req);
};

Understanding Angular Interceptors : Beyond HTTP

外部ツールを使用したインターセプト

外部 HTTP インターセプト ツールは、さまざまなシナリオで非常に役立ちます。特に、組み込みインターセプターで利用できるものを超えて HTTP リクエストと応答をより詳細に制御する必要がある場合に便利です。これらは、API のテストとデバッグ、さまざまなサーバー条件のシミュレーション、およびアプリケーションがさまざまなエッジ ケースを効果的に処理できるようにする場合に特に役立ちます。

Requestly は、開発ワークフローを強化する強力なツールの 1 つです。たとえば、アプリケーションを開発していて、遅いネットワーク応答をどのように処理するかをテストする必要があるとします。

  • インストールと構成: Requestly をブラウザ拡張機能として簡単にインストールし、HTTP リクエストと応答を傍受して変更するルールを設定します。
  • ルール管理: URL、ヘッダー、またはクエリ パラメータに基づいてルールセットを定義および管理し、特定の基準に従ってリクエストをインターセプトします。
  • リクエストの変更: 事前定義されたルールに基づいて、ヘッダーの追加、URL の書き換え、またはリクエストのリダイレクトによってリクエストを変更し、動的テストとデバッグ シナリオを容易にします。
  • 高度な使用例: Requestly を利用して、さまざまなサーバー応答をシミュレートしたり、テスト目的でエンドポイントを模擬したり、開発中に特定のネットワーク条件を強制したりできます。

結論

Angular インターセプターは、HTTP 通信を管理し、Angular アプリケーションの堅牢性を強化するために不可欠なツールです。メソッドをマスターし、Requestly などの外部ソリューションを検討することで、開発者は API 統合を合理化し、セキュリティ慣行を改善し、パフォーマンスを効果的に最適化できます。インターセプターを利用して、Angular アプリケーションの信頼性とスケーラビリティを高め、多様なバックエンド インタラクションを確実かつ効率的に処理します。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/asachanfbd/ Understanding-angular-interceptors-beyond-http-11fe?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • CSSメディアクエリ
    CSSメディアクエリ
    Web サイトがさまざまなデバイス間でシームレスに機能することを保証することが、これまで以上に重要になっています。ユーザーがデスクトップ、ラップトップ、タブレット、スマートフォンから Web サイトにアクセスするようになったため、レスポンシブ デザインが必須となっています。レスポンシブ デザインの中...
    プログラミング 2024 年 11 月 5 日に公開
  • JavaScript でのホイスティングを理解する: 包括的なガイド
    JavaScript でのホイスティングを理解する: 包括的なガイド
    JavaScript でのホイスティング ホイストは、変数と関数の宣言が、含まれるスコープ (グローバル スコープまたは関数スコープ) の先頭に移動 (または「ホイスト」) される動作です。コードが実行されます。これは、コード内で実際に宣言される前に変数や関数を使用できることを意味...
    プログラミング 2024 年 11 月 5 日に公開
  • Stripe を単一製品の Django Python ショップに統合する
    Stripe を単一製品の Django Python ショップに統合する
    In the first part of this series, we created a Django online shop with htmx. In this second part, we'll handle orders using Stripe. What We'll...
    プログラミング 2024 年 11 月 5 日に公開
  • Laravel でキューに入れられたジョブをテストするためのヒント
    Laravel でキューに入れられたジョブをテストするためのヒント
    Laravel アプリケーションを使用する場合、コマンドが負荷の高いタスクを実行する必要があるシナリオに遭遇するのが一般的です。メインプロセスのブロックを避けるために、キューで処理できるジョブにタスクをオフロードすることを決定することもできます。 例を見てみましょう。コマンド app:import-...
    プログラミング 2024 年 11 月 5 日に公開
  • 人間レベルの自然言語理解 (NLU) システムを作成する方法
    人間レベルの自然言語理解 (NLU) システムを作成する方法
    Scope: Creating an NLU system that fully understands and processes human languages in a wide range of contexts, from conversations to literature. ...
    プログラミング 2024 年 11 月 5 日に公開
  • JSTL を使用して HashMap 内で ArrayList を反復するにはどうすればよいですか?
    JSTL を使用して HashMap 内で ArrayList を反復するにはどうすればよいですか?
    JSTL を使用した HashMap 内の ArrayList の反復Web 開発では、JSTL (JavaServer Pages Standard Tag Library) は、JSP での一般的なタスクを簡素化するためのタグのセットを提供します ( Javaサーバーページ)。そのようなタスクの...
    プログラミング 2024 年 11 月 5 日に公開
  • Encore.ts — ElysiaJS や Hono よりも高速
    Encore.ts — ElysiaJS や Hono よりも高速
    数か月前、私たちは TypeScript 用のオープンソース バックエンド フレームワークである Encore.ts をリリースしました。 すでに多くのフレームワークが存在するため、私たちが行った珍しい設計上の決定のいくつかと、それがどのようにして驚くべきパフォーマンス数値につながるのかを共有したい...
    プログラミング 2024 年 11 月 5 日に公開
  • + を使用した文字列連結が文字列リテラルで失敗するのはなぜですか?
    + を使用した文字列連結が文字列リテラルで失敗するのはなぜですか?
    文字列リテラルと文字列の連結C では、演算子を使用して文字列と文字列リテラルを連結できます。ただし、この機能には混乱を招く可能性のある制限があります。質問の中で、作成者は文字列リテラル「Hello」、「,world」、および「!」を連結しようとしています。 2つの異なる方法で。最初の例:const ...
    プログラミング 2024 年 11 月 5 日に公開
  • React の再レンダリング: 最適なパフォーマンスのためのベスト プラクティス
    React の再レンダリング: 最適なパフォーマンスのためのベスト プラクティス
    React の効率的なレンダリング メカニズムは、その人気の主な理由の 1 つです。ただし、アプリケーションが複雑になるにつれて、コンポーネントの再レンダリングの管理がパフォーマンスを最適化するために重要になります。 React のレンダリング動作を最適化し、不必要な再レンダリングを回避するためのベ...
    プログラミング 2024 年 11 月 5 日に公開
  • 条件付き列の作成を実現する方法: Pandas DataFrame で If-Elif-Else を探索する?
    条件付き列の作成を実現する方法: Pandas DataFrame で If-Elif-Else を探索する?
    条件付き列の作成: Pandas の If-Elif-Else指定された問題では、新しい列を DataFrame に追加することが求められます一連の条件付き基準に基づいて決定されます。課題は、コードの効率性と可読性を維持しながらこれらの条件を実装することにあります。関数アプリケーションを使用したソリ...
    プログラミング 2024 年 11 月 5 日に公開
  • 秋さんのご紹介です!
    秋さんのご紹介です!
    Qiu のリリースを発表できることを嬉しく思います。これは、生の SQL を再び楽しくするために設計された、実用的な SQL クエリ ランナーです。正直に言うと、ORM にはその役割がありますが、単純な SQL を書きたいだけの場合は、少し圧倒されてしまう可能性があります。私は生の SQL クエリ...
    プログラミング 2024 年 11 月 5 日に公開
  • CSS でコンテナの幅に基づいてマージントップのパーセンテージが計算されるのはなぜですか?
    CSS でコンテナの幅に基づいてマージントップのパーセンテージが計算されるのはなぜですか?
    CSS でのマージントップ パーセンテージの計算要素にマージントップ パーセンテージを適用する場合、その計算方法を理解することが重要です。実行されました。一般的な考えに反して、マージントップのパーセンテージは、ブロックを含むブロックの高さではなく、幅に基づいて決定されます。W3C 仕様の説明: W3...
    プログラミング 2024 年 11 月 5 日に公開
  • CSS 移行中の Webkit テキストのレンダリングの不一致を解決するにはどうすればよいですか?
    CSS 移行中の Webkit テキストのレンダリングの不一致を解決するにはどうすればよいですか?
    CSS 遷移中の Webkit テキスト レンダリングの不一致を解決するCSS 遷移中、特に要素をスケーリングするときに、Webkit 内でテキスト レンダリングの不一致が発生する可能性があります。ブラウザ。この問題は、ブラウザがレンダリング パフォーマンスを最適化しようとすることが原因で発生します...
    プログラミング 2024 年 11 月 5 日に公開
  • Reactables で簡素化された RxJS
    Reactables で簡素化された RxJS
    導入 RxJS は強力なライブラリですが、学習曲線が急であることが知られています。 ライブラリの大規模な API サーフェスは、リアクティブ プログラミングへのパラダイム シフトと相まって、初心者にとっては圧倒される可能性があります。 RxJS の使用法を簡素化し、開発者がリアクテ...
    プログラミング 2024 年 11 月 5 日に公開
  • Pandas の複数の列にわたる最大値を見つける方法?
    Pandas の複数の列にわたる最大値を見つける方法?
    Pandas の複数の列にわたる最大値の検索Pandas DataFrame の複数の列にわたる最大値を決定するには、さまざまなアプローチを使用できます。 。これを実現する方法は次のとおりです。指定された列で max() 関数を使用するこの方法では、目的の列を明示的に選択し、max() 関数を適用し...
    プログラミング 2024 年 11 月 5 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3