プロジェクトに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 コマンドのインストール方法が見つかりません)

推薦する

Linuxで$を#に変更する方法

このシステムでは、# 記号は root ユーザーを表し、$ 記号は通常のユーザーを表します。では、ど...

Vmwareでディスクを追加する方法:ディスクを拡張する

この記事では、ディスクを追加または拡張して、Vmare で有効にする方法について説明します。シナリオ...

Vue ルーティングフォールバックに最適なソリューション (vue-route-manager)

目次ルーティングマネージャー背景はじめる問題を解決する方法要約するルーティングマネージャー各ジャンプ...

HTML テーブル マークアップ チュートリアル (40): ヘッダーの暗い境界線の色属性 BORDERCOLORDARK

テーブルヘッダーでは、暗い境界線の色を個別に定義できます。基本的な構文<TH 境界線の色を暗く...

VMware12 に CentOS8 をインストールする方法 (VM 仮想マシンに CentOS8 をインストールするチュートリアル)

数日前に CentOS8 がリリースされました。8 の最初のバージョンですが、今日は VM12 に ...

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

Mysql で group_concat の長さ制限を変更する方法

MySQL には、「group_concat」という関数があります。通常の使用では問題がないかもしれ...

Linux環境でOpenSSL証明書を生成する

1. 環境: CentOS7、OpenSSL1.1.1k。 2. コンセプト:ルート証明書: サーバ...

Vue 構成リクエストの複数サーバーソリューションの詳細な説明

1. 解決策1.1 インターフェースコンテキストパスの説明2 つのバックエンド インターフェイス サ...

航空機戦争ゲームを実装するためのネイティブJS

この記事の例では、参考のために航空機戦争ゲームを実装するためのJSの具体的なコードを共有しています。...

XHTMLタグには終了タグがある

<br />オリジナルリンク: http://www.dudo.org/article....

Dockerコンテナとローカルマシン間でファイルを転送する方法

ホストとコンテナ間でファイルを転送するには、コンテナの完全な ID が必要です。取得方法は以下の通り...

Pure CSS と Flutter はそれぞれブリージング ライト効果を実現します (サンプル コード)

前回、非常に熱心なファンから、月を呼吸する光の効果にできるかどうか尋ねられました。月の大きさの写真が...

JSコンストラクタとインスタンス化およびプロトタイプ導入の関係

目次1. コンストラクタとインスタンス化2. コンストラクターとインスタンス化の関係は何ですか? 3...