プロジェクトに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 の varchar 型に関する注意点

varchar の保存ルール4.0 未満のバージョンでは、varchar(20) は 20 バイトを...

Vue で Openlayer を使用して読み込みアニメーション効果を実現する

注意: スコープアニメーションは使用できません。 ! ! ! GIF経由 <テンプレート>...

Vue2 と Vue3 でウォッチ リスナーを使用する方法

watch : データの変更を監視する(特定の値の変更イベント) vue2.x データ(){ 戻る ...

Vue.jsのレンダリング関数の使い方の詳しい説明

Vue では、ほとんどの場合、テンプレートを使用して HTML を作成することを推奨しています。ただ...

珍しいけれど役に立つJSテクニックをいくつか紹介します

序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...

divとtableの選択と組み合わせ方について簡単に説明します

ページレイアウトは、Web ページを扱い始めた頃からずっと気にかけていたことです。初期のテーブル構造...

HTML の div、td、p およびその他のコンテナーでの強制改行と非改行の実装

1. 改行を強制せず、省略記号で終了します。コードをコピーコードは次のとおりです。 <div ...

HTML の iframe と frame の違いを例を使って説明します

プロジェクトで frameset 属性を使用したことがあるかどうかはわかりません。昨年、オンライン ...

フロントエンドの上級者向けコースでは、JavaScript のストレージ機能の使い方を学習します。

目次序文背景実施計画の考え方js ストレージ機能ソリューション設計やっと要約する序文どの SaaS ...

Reactは二次的連鎖効果(階段効果)を実現する

この記事では、二次リンク効果を実現するためのReactの具体的なコードを参考までに共有します。具体的...

JVMシリーズのメモリモデルの詳細な説明

目次1. メモリモデルとランタイムデータ領域2. マインドマップと凡例3. オブジェクトはJVMから...

CSSを使用して円形の波効果を実現する

モバイル デバイスでは、金額を表示するために円形の波グラフィックがよく使用されます。最初は、この効果...

Docker ベースの Etcd 分散デプロイメントの方法と手順

1. 環境整備1.1 基本環境NTP設定: 省略 #時間の一貫性を確保するためにNTPサービスを設定...

gbk utf8 GBK と UTF-8 ウェブページエンコーディングを正しく理解して使用する方法

Web ページ エンコーディングは英語では web page encoding と翻訳され、Web ...

Windows で削除された MySQL 8.0.17 のルート アカウントとパスワードを回復する方法

少し前にSQLの独学を終え、MySQL 8.0.17をダウンロードしました。インストールして設定した...