プロジェクトにaxiosをカプセル化する実際のプロセス

プロジェクトにaxiosをカプセル化する実際のプロセス

序文

勉強やプロジェクトをやっていると、axiosによく遭遇します。以前やったプロジェクトではaxiosを設定していたので、大まかな印象はありました。最近、axiosを手動で設定する機会があったので、ついでに録画して共有します〜

axiosカプセル化の利点

axios カプセル化の利点は、処理の統一、効率性の向上、メンテナンスの容易さです。

axiosリクエストインターフェースは次のように使用できます。

axios.get('http://localhost:10086/user?ID=12345')
  .then(応答 => {
    // 成功後の操作...
  })
  .catch(エラー => {
    // 失敗後の操作...
  });

ただし、インターフェース要求や要件が増えると、プロジェクト内でインターフェース要求が必要なすべての場所にこのようなコードを記述すると、多くの反復コードが生成され、開発効率が低下し、メンテナンス コストが増加します。

パッケージのアイデア

プロジェクトのほとんどのシナリオに構成が適応できるように、axios を一度構成する必要があります。新しい js ファイルを作成し、カスタム構成で新しい axios インスタンスを作成し、インスタンスで基本構成を実行し、リクエスト前の段階 (リクエスト本体の処理) とリクエスト後の段階 (戻り結果の処理) で必要な処理を追加して、使用するためにエクスポートすることができます。

設定の優先順位

構成は優先順位に従ってマージされます。順序は、 lib/defaults.js にあるライブラリのデフォルト、インスタンスの defaults プロパティ、最後にリクエストの config パラメータです。 (このように、特別なシーンを別途処理することもできます)

node_modules フォルダー内の axios ライブラリ ファイルの下にある lib/defaults.js。

カスタムインスタンスのデフォルト

定数インスタンス = axios.create({
  ベースURL: 'https://api.example.com'
});

要求された設定パラメータ

アクシオス({   
メソッド:'get',   
url:'http://bit.ly/2mTM3nY',   
レスポンスタイプ: 'stream' }).then(function(response) { response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) });

axiosインスタンス構成

1. 一般的な設定を定義する

BaseUrlの設定

baseUrl は一般的に、production、development、testing などの複数のアドレスに分かれています。これを保存するための config.js を作成できます。vue や react の場合は、env などのファイルを新規作成して保存できます。次の baseUrl は react の環境変数を使用しています。

  • リクエストのタイムアウト期間を設定する
  • データ要求形式の Content-Type (application/x-www-form-urlencoded、multipart/form-data、application/json...) などを設定します。
'axios' から axios をインポートします

エクスポート const request = createAxiosInstance()

関数createAxiosInstance() {
  定数インスタンス = axios.create({
    ベースURL: process.env.REACT_APP_BASE_URL、
    タイムアウト: 5000、
    ヘッダー: {
      // 統合リクエストヘッダーポストを定義できます: {
        'コンテンツタイプ': 'application/json'
      }
      ...
    }
  })
  インスタンスを返す
}

2. リクエストの前に必要な操作をいくつか追加します。

たとえば、リクエストヘッダーにトークンを追加する必要があります

リクエストパラメータが空の処理

(以下の例では、空の名前と personId が渡されるため、あいまいさが生じる可能性があります。パラメータ値を空のまま取得するか、これらのパラメータを無視する必要がありますか? 一部のバックエンドでは何らかの処理が行われますが、フロントエンドではそれを避けるようにする必要があります~)

インターフェースが要求されるたびにアニメーション効果の読み込みを有効にするなど。

  // リクエストインターセプターを追加する(リクエストを送信する前に何かを行う)
  インスタンス.インターセプター.リクエスト.使用((config) => {
      //読み込みエフェクトを開く関数を追加できます。loading.open()  
      //トークンが存在する場合は、それをリクエスト ヘッダー トークンに追加します && (config.headers.Authorization = token)
     // リクエストパラメータ内の null undefined '' 関数をフィルター cleanObject()
      設定を返す
  })

3. リクエストが返されたら、インターセプト操作を追加します。

  • 返されたデータの処理に成功しました

たとえば、バックエンドから返されるデータは、多くのレイヤーにネストされている場合があります。必要なデータを直接返すことができるため、ビジネス コードは毎回データを分解することなく、最終データを直接取得できます。

  • 失敗後の例外の統一された処理

インターフェース要求は成功する場合と失敗する場合があります。インターフェース要求を記述するたびに失敗ロジック コードを記述したくない場合、また、ほとんど常に繰り返される場合は、ここでインターフェースの統一された例外処理を集中的に実行できます。たとえば、ステータス コードまたはバックエンドのカスタマイズされたコードを判別し、バックエンドから返されたエラー プロンプトを表示します。

 // レスポンスインターセプターを追加する(レスポンスデータで何かを行う)
  インスタンス.インターセプター.レスポンス.use((レスポンス) => {
   //読み込みエフェクトを閉じる関数を追加できます。loading.close()  
      //返された結果データを分解する const res = response.data
      //カスタムコードを判断し、成功したデータを返します const validateStatus = /^(2|3)\d{2}$/ //2または3で始まるコードは成功したリクエストとみなされます if (validateStatus.test(res.code)) {
        return res // 必要なデータを直接返す
      }
      //失敗したコードを判断し、プロンプトなどを表示します。if (res.code === 401) {
        メッセージ.エラー(res.msg)
      } それ以外 {
        メッセージ.警告(res.msg)
      }
      Promise.reject(res) を返す
      },
      (エラー) => {
      読み込み中.閉じる() 
      エラー応答ステータスが401の場合
        message.error('トークンの有効期限が切れています。もう一度ログインしてください!')
        ストレージトークンを削除します。
        タイムアウトを設定する(() => {
          window.location.href = '/ログイン'
        }, 2000)
      } それ以外 {
        (!window.navigator.onLine)の場合{
          message.warning('ネットワーク異常です。ネットワークが正常に接続されているか確認してください')
        } そうでない場合 (error.code === 'ECONNABORTED') {
          message.warning('リクエストタイムアウト')
        } それ以外 {
          message.warning('サーバー異常です。管理者に連絡してください')
        }
      }
      return Promise.reject(error) // 特定のページにエラーを返す}
      )

HTTP ステータス コードとカスタム コードに基づいたエラー処理がいくつかあります。ここでエラーがインターセプトされると、ページがビジネス インターフェイスを呼び出すたびにエラー プロンプト処理を実行する必要がなくなります。もちろん、さまざまなプロジェクトのニーズに応じて構成する必要があります。

リクエストインターフェースメソッドの統合管理

一般的に、統一された管理のためにすべてのインターフェース要求メソッドをまとめて記述します。これにより、後で変更が加えられたときに検索とメンテナンスも容易になります。

API リクエスト (apiList など) を管理するための新しいフォルダーを作成し、そこにさまざまなリクエスト ファイル (ここでは機能ごとに分割) を配置できます。たとえば、user.js にはユーザー関連のリクエストなどが保存されます。その後、ページはメソッドを直接参照してインターフェース呼び出しを行うことができます。

'../axios' から { request } をインポートします

// ユーザー情報を取得するエクスポート関数 getUserInfo (userId) {
  request.get(`/sys/user/info/${userId}`) を返します
}

コンポーネントまたはページ内でメソッドを直接呼び出すだけです〜

最後に、完全な例を示します。参考にしてくださいね〜

この例の設定は、vue または react に適しています。もちろん、各プロジェクトの設定は若干異なります。自分のプロジェクトに合わせて変更、拡張してください。

'axios' から axios をインポートします

エクスポート const request = createAxiosInstance()

関数createAxiosInstance() {
  定数インスタンス = axios.create({
    ベースURL: process.env.REACT_APP_BASE_URL、
    タイムアウト: 5000、
    ヘッダー: {
      // 統合リクエストヘッダーポストを定義できます: {
        'コンテンツタイプ': 'application/json'
      }
      ...
    }
  })
   // リクエストインターセプターを追加する(リクエストを送信する前に何かを行う)
  インスタンス.インターセプター.リクエスト.使用((config) => {
      //読み込みエフェクトを開く関数を追加できます。loading.open()  
      //トークンが存在する場合は、それをリクエスト ヘッダー トークンに追加します && (config.headers.Authorization = token)
     // リクエストパラメータ内の null undefined '' 関数をフィルター cleanObject()
      設定を返す
  })
  // レスポンスインターセプターを追加する(レスポンスデータで何かを行う)
  インスタンス.インターセプター.レスポンス.use((レスポンス) => {
   //読み込みエフェクトを閉じる関数を追加できます。loading.close()  
      //返された結果データを分解する const res = response.data
      //カスタムコードを判断し、成功したデータを返します const validateStatus = /^(2|3)\d{2}$/ //2または3で始まるコードは成功したリクエストとみなされます if (validateStatus.test(res.code)) {
        戻り値
      }
      //失敗したコードを判断し、プロンプトなどを表示します。if (res.code === 401) {
        メッセージ.エラー(res.msg)
      } それ以外 {
        メッセージ.警告(res.msg)
      }
      Promise.reject(res) を返す
      },
      (エラー) => {
      loading.close() //読み込みエフェクトを閉じる関数を追加できます if (error.response.status === 401) {
        message.error('トークンの有効期限が切れています。もう一度ログインしてください!')
        ストレージトークンを削除します。
        タイムアウトを設定する(() => {
          window.location.href = '/ログイン'
        }, 2000)
      } それ以外 {
        (!window.navigator.onLine)の場合{
          message.warning('ネットワーク異常です。ネットワークが正常に接続されているか確認してください')
        } そうでない場合 (error.code === 'ECONNABORTED') {
          message.warning('リクエストタイムアウト')
        } それ以外 {
          message.warning('サーバー異常です。管理者に連絡してください')
        }
      }
      return Promise.reject(error) // 特定のページにエラーを返す}
      )
  
  インスタンスを返す
}

要約する

これで、プロジェクトで axios をカプセル化する方法についての記事は終了です。関連プロジェクトで axios をカプセル化する方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue 2.0 カプセル化の詳細な説明 axios notes
  • Vue で axios とカプセル化を使用するサンプルコード
  • Axios カプセル化、インターセプターを使用してインターフェースを均一に処理する、非常に詳細なチュートリアル (推奨)
  • vue axios のカプセル化されたリクエスト ステータスのエラー プロンプト問題を解決する
  • Vue での Axios リクエストのカプセル化の詳細な説明
  • Axios を使用して Vue プロジェクトで http リクエストをカプセル化する方法
  • Vue での Axios の二次カプセル化の例
  • vue+ts での axios のカプセル化実装
  • Vue での axios のカプセル化例の詳細な説明

<<:  MySQLサブクエリの詳細な例

>>:  Linux には make コマンドがありません (make: *** ターゲットが指定されておらず、makefile または make コマンドのインストール方法が見つかりません)

推薦する

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

Vue が天気予報機能を実装

この記事では、天気予報機能を実現するためのVueの具体的なコードを参考までに共有します。具体的な内容...

vue3 学習ノートにおける axios の使用の変更の概要

目次1. axioの基本的な使い方2. クロスドメインの問題を解決するには? 3. パッケージ4. ...

docker compose の記述ルールについての簡単な説明

この記事ではクラスタの展開に関連する内容は紹介しませんバージョン制約Docker エンジン >...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

ウェブページレイアウトに関する9つのヒント

<br />関連記事: Web コンテンツ ページ作成に関する 9 つの実用的な提案 W...

MySQL マルチバージョン同時実行制御 MVCC の実装

トランザクション分離レベルの設定 グローバルトランザクション分離レベルを読み取りコミット済みに設定;...

カルーセルバナーの自動回転効果を実現する純粋な CSS

さっそくコードを見てみましょう * { マージン: 0; パディング: 0; } 。容器 { マージ...

Nginx での SSL 証明書のインストールと展開手順の概要

目次問題の説明:インストール手順1. 準備2. サーバーにリモート接続する3. 証明書と秘密鍵ファイ...

MySQL インデックス障害の上位 10 の問題の概要

目次背景1. クエリ条件に「or」が含まれているため、インデックスが失敗する可能性があります。 2....

mysql update文の実行プロセスの詳細な説明

以前、MySQL クエリ文の実行プロセスについての記事がありました。ここでは、更新文の実行プロセスを...

process.env.NODE_ENV 本番環境モードを設定する方法

始める前に、process.env.NODE_ENV にはデフォルトで開発と本番の 2 つの状態しか...

html2canvas を使用して、Baidu マップを含む Dom 要素を画像に処理するソリューション

問題 1: Baidu Map はタイル画像 (地図が写真で構成されている) を使用しています。ht...

WeChatアプレットで画像の幅と高さを取得する方法

起源最近、私は要件 A に取り組んでいます。そこには、次のように記述される小さな機能ポイントがありま...