序文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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: WebプロジェクトのDockerデプロイメントの実装
今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...
HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...
このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...
以前、テーブル結合クエリを書いていたとき、whereとonの違いがわからず、SQLに小さな問題が発生...
ここでは主に、WeChat アプレットでラッキーホイール ゲームを開発する方法を紹介します。主に J...
http://www.cppcns.com/shujuku/mysql/283231.html 8....
以下のように表示されます。 def test_write(self): フィールド=[] field...
目次1. サブクエリとは何ですか? 2. 自己結合3. 自然な結合4. 外部接続1. サブクエリとは...
この記事では、参考までに、製品拡大鏡を実装するためのJavaScriptの具体的なコードを紹介します...
方法 1: 設定ファイルを変更する (docker サービスを停止する必要があります) 1. doc...
varchar の保存ルール4.0 未満のバージョンでは、varchar(20) は 20 バイトを...
目次1. reduxとreactの関係2. Reactのマルチコンポーネント共有3. reduxの3...
react-native インストールプロセス1.npx react-native init Awe...
序文今日はちょっとしたデモを書きました。左右にスワイプするロジックに関わる部分があります。当初はプラ...
1. getBoundingClientRect() 分析getBoundingClientRect...