序文勉強やプロジェクトをやっていると、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の設定
'axios' から axios をインポートします エクスポート const request = createAxiosInstance() 関数createAxiosInstance() { 定数インスタンス = axios.create({ ベースURL: process.env.REACT_APP_BASE_URL、 タイムアウト: 5000、 ヘッダー: { // 統合リクエストヘッダーポストを定義できます: { 'コンテンツタイプ': 'application/json' } ... } }) インスタンスを返す } 2. リクエストの前に必要な操作をいくつか追加します。たとえば、リクエストヘッダーにトークンを追加する必要があります リクエストパラメータが空の処理
インターフェースが要求されるたびにアニメーション効果の読み込みを有効にするなど。 // リクエストインターセプターを追加する(リクエストを送信する前に何かを行う) インスタンス.インターセプター.リクエスト.使用((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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Linux には make コマンドがありません (make: *** ターゲットが指定されておらず、makefile または make コマンドのインストール方法が見つかりません)
このシステムでは、# 記号は root ユーザーを表し、$ 記号は通常のユーザーを表します。では、ど...
この記事では、ディスクを追加または拡張して、Vmare で有効にする方法について説明します。シナリオ...
目次ルーティングマネージャー背景はじめる問題を解決する方法要約するルーティングマネージャー各ジャンプ...
html <div> 要素 <button type="button&q...
テーブルヘッダーでは、暗い境界線の色を個別に定義できます。基本的な構文<TH 境界線の色を暗く...
数日前に CentOS8 がリリースされました。8 の最初のバージョンですが、今日は VM12 に ...
この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...
MySQL には、「group_concat」という関数があります。通常の使用では問題がないかもしれ...
1. 環境: CentOS7、OpenSSL1.1.1k。 2. コンセプト:ルート証明書: サーバ...
1. 解決策1.1 インターフェースコンテキストパスの説明2 つのバックエンド インターフェイス サ...
この記事の例では、参考のために航空機戦争ゲームを実装するためのJSの具体的なコードを共有しています。...
<br />オリジナルリンク: http://www.dudo.org/article....
ホストとコンテナ間でファイルを転送するには、コンテナの完全な ID が必要です。取得方法は以下の通り...
前回、非常に熱心なファンから、月を呼吸する光の効果にできるかどうか尋ねられました。月の大きさの写真が...
目次1. コンストラクタとインスタンス化2. コンストラクターとインスタンス化の関係は何ですか? 3...