[解決済み] axiosのインターセプターはどのように使用するのですか?
質問
axiosのドキュメントを見ましたが、以下のことしか書かれていません。
// Add a request interceptor
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
また、多くのチュートリアルはこのコードしか示していませんが、私はそれが何のために使用されているのか混乱しています、誰かが私に従うために簡単な例を与えることができます。
どのように解決するのですか?
簡単に説明すると、すべてのHTTPアクションに対するチェックポイントのようなものです。行われたすべてのAPIコールは、このインターセプターを通されます。
では、なぜ2つのインターセプターがあるのでしょうか?
APIコールは、リクエストとレスポンスの2つで構成されています。チェックポイントのように振る舞うので、リクエストとレスポンスは別々のインターセプターを持っています。
リクエストインターセプターの使用例をいくつか紹介します。
リクエストを行う前に、あなたの認証情報が有効かどうかを確認したいとします。そこで、実際にAPIコールをする代わりに、インターセプターレベルでクレデンシャルが有効かどうかをチェックすることができます。
すべてのリクエストにトークンをアタッチする必要があるとします。Axiosのコールごとにトークン追加ロジックを重複させるのではなく、リクエストされるごとにトークンをアタッチするインターセプターを作ることができます。
レスポンスインターセプターの使用例をいくつかご紹介します。
レスポンスを取得し、APIのレスポンスから判断して、ユーザーがログインしていることを推論したいとします。そこで、レスポンスインターセプターの中で、ユーザーのログイン状態を扱うクラスを初期化し、受け取ったレスポンスオブジェクトに応じてそれを更新することができます。
有効なAPI認証情報を使ってあるAPIをリクエストしたが、データにアクセスするための有効なロールを持っていないと仮定する。そこで、レスポンスインターセプターから「そのユーザーは許可されていない」というアラートを出すことができます。こうすれば、Axiosのリクエストごとに行わなければならない不正なAPIエラー処理から解放されます。
以下はコード例です。
リクエストインターセプター
-
することで(必要であれば)axiosの設定オブジェクトを出力することができます(この場合、環境変数を確認することで)。
const DEBUG = process.env.NODE_ENV === "development"; axios.interceptors.request.use((config) => { /** In dev, intercepts request and logs it into console for dev */ if (DEBUG) { console.info("✉️ ", config); } return config; }, (error) => { if (DEBUG) { console.error("✉️ ", error); } return Promise.reject(error); });
-
どのようなヘッダが渡されているかを確認したい場合/さらに汎用的なヘッダを追加したい場合、それは
config.headers
オブジェクトを作成します。例えばaxios.interceptors.request.use((config) => { config.headers.genericKey = "someGenericValue"; return config; }, (error) => { return Promise.reject(error); });
-
万が一、それが
GET
リクエストの場合、送信されるクエリパラメータはconfig.params
オブジェクトを作成します。
レスポンスインターセプター
-
も可能です。 オプションで をインターセプターレベルで解析し、元のレスポンスの代わりに解析されたレスポンスを渡します。APIが複数の場所で同じように使われる場合に、何度も解析ロジックを書く手間を省くことができるかもしれません。そのためのひとつの方法として
api-request
を作成し、レスポンスインターセプターで同じパラメータを使用してアクションを実行します。たとえば//Assume we pass an extra parameter "parse: true" axios.get("/city-list", { parse: true });
一度、レスポンスインターセプターの中で、次のように使ってみましょう。
axios.interceptors.response.use((response) => { if (response.config.parse) { //perform the manipulation here and change the response object } return response; }, (error) => { return Promise.reject(error.message); });
つまり、この場合、常に
parse
オブジェクトをresponse.config
であれば、操作は完了し、それ以外のケースはそのまま動作します。 -
到着したものを表示することもできます
HTTP
のコードを読み込んでから判断します。例えばaxios.interceptors.response.use((response) => { if(response.status === 401) { alert("You are not authorized"); } return response; }, (error) => { if (error.response && error.response.data) { return Promise.reject(error.response.data); } return Promise.reject(error.message); });
関連
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 Uncaught TypeError: data.push is not a function
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】Uncaught SyntaxError: JSON の位置 0 に予期しないトークン u があります。
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】 \u003C とは何ですか?
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない