React プロジェクトにおける axios カプセル化と API インターフェース管理の詳細な説明

React プロジェクトにおける axios カプセル化と API インターフェース管理の詳細な説明

序文

React プロジェクトでは、通常、バックグラウンドとやり取りしてデータを取得するために axios ライブラリを使用します。これは、ブラウザと node.js で実行できる promise ベースの http ライブラリです。リクエストとレスポンスのインターセプト、リクエストのキャンセル、JSON の変換、クライアント側での XSRF に対する防御など、多くの優れた機能を備えています。 axios についてまだよくわからない場合は、axios のドキュメントを参照してください。

インストール

//npm を使用してインストールします npm install axios; 
//yarn を使用して yarn add axios をインストールします

導入

プロジェクトのルート ディレクトリに request フォルダーを作成し、その中に index.js ファイルと api.js ファイルを作成します。 index.js ファイルは axios をカプセル化するために使用され、api.js はインターフェースを統一的に管理するために使用されます。

//index.js に axios を導入する
'axios' から axios をインポートします。
// 投稿タイプデータをシリアル化するために qs モジュールを導入します。import QS from 'qs';
//Antd のメッセージ プロンプト コンポーネント。独自の UI コンポーネントに応じて変更できます。
'antd' から { message } をインポートします

環境の切り替え

プロジェクト環境には、開発環境、テスト環境、本番環境が含まれる場合があります。デフォルトのインターフェース URL プレフィックスと一致させるために、Node の環境変数を使用します。ここではノードのグローバル変数 process が必要であり、process.env.NODE_ENV は開発環境か本番環境かを区別できます。

//環境変数を保存します const isPrd = process.env.NODE_ENV == 'production';

//開発環境と本番環境のベース URL を区別する
エクスポート const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

ここでベースURLをエクスポートするのは、他で異なるリソースが使用されるのを防ぐためです。本番環境と開発環境を区別する必要があります。インポート後、そのまま使用できます。

傍受を要求する

リクエストを送信する前にインターセプトすることができます。なぜインターセプトする必要があるのでしょうか? リクエストをインターセプトする目的は何でしょうか?たとえば、一部のリクエストでは、ユーザーがアクセスする前にログインする必要があります。また、POST リクエストを行うときは、送信するデータをシリアル化する必要があります。この時点で、リクエストが送信される前にそれを傍受し、必要な操作を実行できます。

//axiosベースパスを設定する const service = axios.create({
  ベースURL: 基本URL
})
// リクエストインターセプター service.interceptors.request.use(config => { 
  // 各リクエストを送信する前に、ローカル ストレージにトークンがあるかどうかを確認します。ここで Redux を使用して、トークンをローカルで取得する方法のみを示すこともできます。
  // 存在する場合は、トークンを http リクエストのヘッダーに追加して、バックエンドがトークンに基づいてログイン ステータスを判断できるようにします。 // トークンがローカルに存在する場合でも、トークンの有効期限が切れている可能性があるため、応答インターセプターで戻りステータスを判断する必要があります。 const token = window.localStorage.getItem('userToken') || window.sessionStorage.getItem('userToken');
  //各リクエストにトークンを追加する
  config.data = Object.assign({}, config.data, {
    トークン: トークン、
  })
  //リクエストヘッダーを設定する config.headers = {
    'コンテンツ タイプ': 'application/x-www-form-urlencoded; charset=utf-8'
  }
  config.data = QS.stringify(config.data)
  設定を返す
}, エラー => { 
    エラーを返します。
})

ここでトークンについてお話ししましょう。一般的に、ログインが完了すると、ユーザーのトークンは localStorage または sessionStorage を通じてローカルに保存されます。その後、ユーザーがページに入るたびに (つまり、main.js で)、まずローカル ストレージからトークンが読み込まれます。トークンが存在する場合、ユーザーがログインしたことを意味し、Redux 内のトークン ステータスが更新されます。その後、インターフェースをリクエストするたびに、リクエスト ヘッダーにトークンが挿入されます。バックエンド スタッフは、挿入されたトークンに基づいて、ログインの有効期限が切れているかどうかを判断できます。トークンが挿入されていない場合は、一度もログインしたことがないことを意味します。

レスポンスインターセプション

// レスポンスインターセプター service.interceptors.response.use(response => {
  // 返されたステータスコードに基づいて異なる処理を実行します// バックエンド開発者と統一されたエラーステータスコードについて交渉してください if (response.code) {
    スイッチ (応答コード) {
      ケース200:
        応答データを返します。
      ケース401:
        //処理メソッドでログに記録されない break;
      ケース403:
        //トークン有効期限処理メソッド break;
      デフォルト:
        メッセージ.エラー(応答データ.msg)
    }
  } それ以外 { 
    応答を返します。
  }
})
//最後に、カプセル化されたaxiosエクスポートデフォルトサービスをエクスポートします

レスポンス インターセプターは簡単に理解できます。これはサーバーから返されるデータであり、それを取得する前に何らかの処理を行うことができます。たとえば、上記の考え方は、バックグラウンドによって返されるステータス コードが 200 の場合、データが正常に返され、それ以外の場合は、必要なエラーが間違ったステータス コードの種類に応じて処理されるというものです。返されたステータス コードに応じて処理する必要がある特定のプロセスについては、バックグラウンド開発者と交渉する必要があります。

上記の message.error() メソッドは、私が紹介した antd のライブラリ プロンプト コンポーネントです。UI ライブラリに応じてプロンプト コンポーネントを使用する必要があります。

APIの統合管理

きちんとした API は回路基板のようなもので、回路がどんなに複雑であっても回路全体が明確になります。前述のように、新しい api.js を作成し、すべての API インターフェースをこのファイルに保存します。

まず、api.jsにカプセル化されたaxiosを導入します。

//パッケージ化されたaxiosをインポートする 
'./index' からサービスをインポートします

たとえば、次のような POST リクエストのインターフェースがあります。

http://www.development.com/api/v1/article編集

次のように api.js にカプセル化できます。

エクスポート const apiArticleEdit = info => service.post('/api/v1/articleEdit', info);

インターフェースを要求するときに渡すパラメーター オブジェクトであるパラメーター info を持つ apiArticleEdit メソッドを定義します。次に、カプセル化された axios メソッドを呼び出します。最初のパラメーターはインターフェース アドレスで、2 番目のパラメーターは apiArticleEdit の info パラメーターです。これは、インターフェースを要求するときに渡されるパラメーター オブジェクトです。最後に、エクスポートを通じて apiArticleEdit をエクスポートします。

次に、ページ内で次のように API インターフェースを呼び出すことができます。

React をインポートします。{ コンポーネント } を 'react' からインポートします。
 './request/api' から { apiArticleEdit } をインポートします。
デフォルトクラスAppをエクスポートし、Componentを拡張します。
  コンポーネントマウント() { 
    // API インターフェースを呼び出して 2 つのパラメータを指定します。let params = { type: 2, author: '北孤清茶' }
    apiArticleEdit(params).then(res => { 
      //データ取得成功後のその他の操作//.....
      コンソール.log(res)
    })
  }
  与える() {
    戻る (
      <div>
        
      </div>
    )
  }
}

他の API インターフェースについては、api.js で拡張を続けます。親切なリマインダー、各インターフェースにコメントを書いてください! ! !

API インターフェース管理の利点の 1 つは、API を一元化できることです。後でインターフェースを変更する必要がある場合、各ページに移動してインターフェースを見つけて変更するのではなく、api.js で対応する変更を直接見つけることができます。これは非常に面倒です。重要なのは、変更の量が大きい場合はどうなるかということです。さらに、ビジネス コード内で直接インターフェイスを変更すると、誤ってビジネス コードを移動してしまい、不要なトラブルが発生する可能性が高くなります。

さて、最後に、完成した axios カプセル化コードを示します。

//index.js に axios を導入する
'axios' から axios をインポートします。
// 投稿タイプデータをシリアル化するために qs モジュールを導入します。import QS from 'qs';
//Antd のメッセージ プロンプト コンポーネント。独自の UI コンポーネントに応じて変更できます。
'antd' から { message } をインポートします

//環境変数を保存します const isPrd = process.env.NODE_ENV == 'production';

//開発環境と本番環境のベース URL を区別する
エクスポート const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

//axiosベースパスを設定する const service = axios.create({
  ベースURL: 基本URL
})

// リクエストインターセプター service.interceptors.request.use(config => { 
  // 各リクエストを送信する前に、ローカル ストレージにトークンがあるかどうかを確認します。ここで Redux を使用して、トークンをローカルで取得する方法のみを示すこともできます。
  // 存在する場合は、トークンを http リクエストのヘッダーに追加して、バックエンドがトークンに基づいてログイン ステータスを判断できるようにします。 // トークンがローカルに存在する場合でも、トークンの有効期限が切れている可能性があるため、応答インターセプターで戻りステータスを判断する必要があります。 const token = window.localStorage.getItem('userToken') || window.sessionStorage.getItem('userToken');
  //各リクエストにトークンを追加する
  config.data = Object.assign({}, config.data, {
    トークン: トークン、
  })
  //リクエストヘッダーを設定する config.headers = {
    'コンテンツ タイプ': 'application/x-www-form-urlencoded; charset=utf-8'
  }
  // リクエストパラメータをシリアル化します。そうしないと、POST リクエストパラメータがバックエンドで正常に受信されません。config.data = QS.stringify(config.data)
  設定を返す
}, エラー => { 
    エラーを返します。
})

// レスポンスインターセプター service.interceptors.response.use(response => {
  // 返されたステータスコードに基づいて異なる処理を実行します// バックエンド開発者と統一されたエラーステータスコードについて交渉してください if (response.code) {
    スイッチ (応答コード) {
      ケース200:
        応答データを返します。
      ケース401:
        //処理メソッドでログに記録されない break;
      ケース403:
        //トークン有効期限処理メソッド break;
      デフォルト:
        メッセージ.エラー(応答データ.msg)
    }
  } それ以外 { 
    応答を返します。
  }
})
//最後に、カプセル化されたaxiosエクスポートデフォルトサービスをエクスポートします

要約する

React プロジェクトにおける axios のカプセル化と API インターフェース管理に関するこの記事はこれで終わりです。React における axios のカプセル化と API インターフェースに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Reactのaxiosモジュールをご存知ですか?
  • React の Axios モジュールとその使い方
  • React Nativeでaxiosを使用してネットワークリクエストを行う方法
  • 1 つ以上のドメイン名への React axios クロスドメイン アクセス
  • Reactはaxiosを使用してAPIネットワークリクエストをカプセル化します

<<:  SQL の左結合と右結合の原理と例の分析

>>:  WebプロジェクトのDockerデプロイメントの実装

推薦する

JSはプログレスバーをドラッグして要素の透明度を変更することを実装しています

今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...

HTMLはWEB標準の開発の中心的な基盤です

HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...

Web ページの HTML コードの説明: 順序付きリストと順序なしリスト

このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...

MySQL の where と on の違いと、いつ使用するか

以前、テーブル結合クエリを書いていたとき、whereとonの違いがわからず、SQLに小さな問題が発生...

WeChatアプレットでラッキーホイールゲームを実装する方法

ここでは主に、WeChat アプレットでラッキーホイール ゲームを開発する方法を紹介します。主に J...

Pythonは出力をcsv操作に書き込む

以下のように表示されます。 def test_write(self): フィールド=[] field...

mysql サブクエリと結合テーブルの詳細

目次1. サブクエリとは何ですか? 2. 自己結合3. 自然な結合4. 外部接続1. サブクエリとは...

製品の拡大鏡効果を実現する JavaScript

この記事では、参考までに、製品拡大鏡を実装するためのJavaScriptの具体的なコードを紹介します...

Docker - コンテナマウントディレクトリを変更する3つの方法のまとめ

方法 1: 設定ファイルを変更する (docker サービスを停止する必要があります) 1. doc...

Mysql の varchar 型に関する注意点

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

ReactとReduxの関係を詳しく説明

目次1. reduxとreactの関係2. Reactのマルチコンポーネント共有3. reduxの3...

React Native環境のインストールプロセス

react-native インストールプロセス1.npx react-native init Awe...

ネイティブ JS を使用してタッチスライド監視イベントを実装する方法

序文今日はちょっとしたデモを書きました。左右にスワイプするロジックに関わる部分があります。当初はプラ...

js の getBoundingClientRect() メソッドの詳細な説明

1. getBoundingClientRect() 分析getBoundingClientRect...