Vue プロジェクトで axios リクエストを使用する方法

Vue プロジェクトで axios リクエストを使用する方法

実際のプロジェクトではバックグラウンドとのデータ連携が欠かせません。普段は axios ライブラリを使用しているので、以下の例も axios をベースにカプセル化しています。

1. インストール

最初のステップは、npmでaxiosをインストールすることです。とても簡単です: npm install axios

2. カプセル化に問題はない

プロジェクトにカプセル化されたインターフェースがない場合、ファイル内のあらゆる場所に次のインターフェース呼び出しメソッドが表示されます。

this.$axios.post("/user/add", {
    パラメータ: {
        名前: this.name,
        年齢: this.age
    }
})
.then(res => {
    コンソール.log(res)
})
.then(err => {
    コンソール.log(res)
})

この書き方でも不可能ではないのですが、いくつか欠点があります。インターフェースリクエストの URL がさまざまなファイルに分散しています。インターフェース呼び出しが成功または失敗したときに何らかの処理を実行する必要がある場合は、各ファイルを変更する必要があります。したがって、これらのインターフェース要求は一緒に一元管理されます。調整がある場合は、各ファイルを再度確認しなくても、一元管理されたファイルで変更を直接見つけることができます。

3. ファイルを作成する

まず、プロジェクトの src ディレクトリに、次のように新しいフォルダーとファイル ディレクトリ構造を作成します。

├── src ソースコードディレクトリ

│ ├── APISインターフェースファイルディレクトリ

│ │ ├── login.api.js ログインモジュールインターフェースAPI

│ │ └── user.api.js ユーザーモジュールインターフェースAPI

│ ├── サービスリクエスト関連ファイルディレクトリ

│ │ ├── address.js リクエストアドレス設定ファイル

│ │ └── request.js axios カプセル化、リクエストインターセプト、レスポンスコード処理、その他の操作

API インターフェース ファイル モジュールの分割は、実際のプロジェクト、ビジネス機能、ビジネス ロジック、またはその他の形式に基づいて行うことができます。

4. アドレス設定をリクエストする

通常、複数のプロジェクト環境があり、少なくとも 1 つには開発環境と本番環境があります。通常、開発環境と本番モードでは baseURL が異なるため、環境に応じて異なる baseURL を切り替える必要があります。

address.js ファイル:

// process.env.NODE_ENV に応じて異なるベース URL を切り替えます
const isPro = process.env.NODE_ENV === 'production'
​
モジュール.エクスポート = {
    // 'apis': vue.config.js のプロキシによって設定されたプロキシ ベース URL: isPro ? 'http://192.168.100.120/ceds' : '/apis'
}

5. Axios の設定、リクエスト ヘッダーとレスポンス コードの処理の設定

一般的な考え方は、get や post などのリクエスト メソッドを含むリクエスト クラスをカプセル化することです。これらのリクエスト メソッドはリクエスト メソッドを呼び出し、リクエスト メソッドは渡されたさまざまなパラメーターを通じて元の axios リクエストを呼び出し、Promise を返します。

request.js ファイル:

'axios' から axios をインポートします
'qs' から Qs をインポートします
'vue' から Vue をインポートします
import { getToken } from '@Utils/session.utils' // トークンファイルを保存して取得する import address from './address' // アドレスを要求する
クラスリクエスト{
    コンストラクタ(){
        // axiosインスタンスを作成する this._axios = axios.create({
            ベースURL: アドレス.ベースURL、
            timeout: 1000 * 5, // リクエストタイムアウトヘッダー: {}
        })
        // リクエストインターセプション this._axios.interceptors.request.use(
            設定 => {
                constリクエストヘッダー = {
                    'X-リクエスト': 'XMLHttpRequest',
                    'コンテンツタイプ': 'application/json; 文字セット=UTF-8',
                    'アクセス制御許可オリジン': '*',
                    token: getToken() // リクエストヘッダーにトークンを追加する
                }
                config.headers = Object.assign(config.headers、リクエストヘッダー)
                設定を返す
            },
            エラー => {
                Promise.reject(エラー)
            }
        )
    }
     
    // リクエスト メソッドに基づいて、パラメータをクエリに配置するか本文に配置するかを決定します。
    // 最も直感的な違いは、たとえば、GET リクエストでは URL にパラメータが含まれるのに対し、POST ではリクエスト ボディを通じてパラメータがボディ内に配置され、送信時のパラメータ形式が異なることです // 以下は、私がリクエスト メソッドで一般的に使用する 4 つのパラメータ形式です。これらは自分で調整できます。/**
      * GETリクエストを送信します * @param {String} URLアドレス * @param {Object} queryクエリパラメータ * @return jsonデータ */
    取得 (URL、クエリ = {}) {
        this._request('get')(url, { を返します。
            ...クエリ
        })
    }
    /**
      * 投稿リクエストを送信 * @param {String} URL アドレス * @param {Object} 本文クエリパラメータ * @return json データ */
    投稿(url, 本文 = {}, ヘッダー) {
        データを入力します。
        if (this.isFormData(body)) {
            データ = 本文
        } そうでない場合は、Array.isArray(body) となります。
            データ = 本文
        } それ以外 {
            データ = { ...本文 }
        }
        this._request('post')(url, headers)(url, data); を返します。
    }
    (URL、本文 = {})を配置します{
        this._request('put')(url, { を返します。
            ...体
        });
    }
    削除(url, 本文 = {}) {
        this._request('delete')(url, { を返します。
            ...体
        });
    }
​
    isFormData = v => {
        Object.prototype.toString.call(v) === '[オブジェクト FormData]' を返します
    }
​
​
    /**
      * リクエストヘッダーを設定 * @param {Object} header リクエストヘッダー */
    setHeaders(ヘッダー) {
        Object.keys(ヘッダー).forEach(キー => {
            this._axios.defaults.headers[キー] = ヘッダー[キー]
        })
    }
​
    // リクエストヘッダーを処理する
    ハンドルヘッダー() {
        定数ヘッダー = {}
        ヘッダー['XMIME-TYPE'] = '3'
        ヘッダー['Content-Type'] = 'application/json; charset=UTF-8'
        リターンヘッダー
    }
​
    /**
      * リクエストを送信 * @param {String} method リクエストメソッドタイプ * @param headers
      * @returns {function(*=, *=):Promise<unknown>}
      * @プライベート
      */
    _request (メソッド、ヘッダー) {
        this.setHeaders(this.handleHeaders()) // 統合リクエストヘッダーを設定する if (headers) {
            this.setHeaders(headers) //カスタムリクエストヘッダー}
         
        戻り値 (URL、データ、タイムアウト) => {
            定数設定 = {
                URL、
                方法、
                タイムアウト: タイムアウト || this._axios.defaults.timeout
            } //リクエスト構成を構築
​
            // リクエストタイプを判定する get post
            const paramType = ['get', 'delete'].indexOf(method) !== -1 ? 'params' : 'data'
            config[パラメータタイプ] = データ
            //パラメータのシリアル化 config.paramsSerializer = params => {
                Qs.stringify(params, { arrayFormat: 'repeat' }); を返します。
            }
             
            新しい Promise を返します ((resolve, reject) => {
                // 実際のリクエストを送信し、権限を確認し、404やその他のステータスをチェックします
                this._axios
                    .request(設定)
                    .then(応答 => {
                        if (this.handleSuccessStatus(response.data.code, response.data)) {
                            レスポンスヘッダー['content-type'] !== 'text/plain; charset=urf-8'の場合{
                            解決する(
                                    // レスポンス結果の二次パッケージ化 Object.assign(
                                      {
                                          成功: 数値(response.data.code) === 200、
                                            データ: response.data.data、
                                            メッセージ: 応答データメッセージ
                                        },
                                       レスポンスデータ
                                    )
                                ) // 返された結果を処理する } else {
                                解決(応答データ)
                            }
                        }
                    }, 応答 => {
                        // エラーコードを処理する if(response.response) {
                            const ステータスコード = response.response.status
                            this.handleErrorStatus(ステータスコード)
                        } それ以外 {
                          Vue.prototype.$message.error(レスポンス.message)
                        }
                        拒否(応答)
                    })
                    .catch(エラー => {
                        拒否(エラー)
                    })
                })
            }
        }
    }
​
    // リクエストは成功し、エラーコードが返されます // 具体的なステータスコードはバックエンド開発者と一致し、ステータスコードに応じて対応するプロンプトが表示されます // 以下はプロジェクトでの私の操作ですが、自分で調整して拡張できます handleSuccessStatus (code, data) {
        結果 = ''
        フラグを false にする
        スイッチ(コード){
            ケース '20007':
                result = 'セカンダリ認証パスワードが見つかりませんでした! '
                フラグ = true
                壊す
            ケース '20008':
                result = 'セカンダリ認証パスワードが変更されていません。まずこれを変更してください。 '
                フラグ = true
                壊す
            ケース '20009':
                結果 = 'セカンダリ認証がまだ有効になっていません。管理者に問い合わせてください! '
                フラグ = true
                壊す
            ケース '90001':
                result = 'セカンダリ認証パスワードを入力してください! '
                フラグ = true
                壊す
            ケース '90002':
                result = '操作権限がありません! '
                フラグ = true
                壊す
            デフォルト:
                壊す
        }
​
        // 通知 // $message メソッドは、私がオンデマンドで導入した element-ui のプロンプト コンポーネントです。これを独自のプロンプト コンポーネントに置き換えることができます。if (result) {
            Vue.prototype.$message.error(結果)
        }
        リターンフラグ
    }
    // エラーコードに基づいてエラーメッセージを取得します。handleErrorStatus (statusCode) {
        errorMsg = '' とします
        ステータスコード === 500 の場合
            errorMsg = 'データ要求に失敗しました。管理者に連絡してください! '
        } それ以外の場合 (ステータスコード === 404) {
            errorMsg = 'リクエストアドレスエラー! '
        } それ以外の場合 (ステータスコード === 402) {
            errorMsg = '現在、このデータを操作する権限がありません。 '
        } それ以外 {
            errorMsg = 'リクエストエラー! '
        }
        // Vue.prototype.$message.error(errorMsg) に通知します。
    }
}
​
デフォルトの新しいリクエストをエクスポートする()

6. 使用

インターフェース管理ファイルでは、上記でカプセル化されたリクエスト クラスを呼び出して、対応するパラメータを渡すことができます。

user.api.js ファイル:

'../services/request' から http をインポートします
​
/**
 * @description ユーザーリストを取得* @param {*} params リクエストインターフェースのパラメータ*/
// ここで定義された reqUserList メソッドは、カプセル化されたリクエスト内の get メソッドを呼び出します。get メソッドの最初のパラメータはリクエスト アドレスで、2 番目のパラメータはクエリ パラメータです。 export const reqUserList = params => http.get('/user/list', params)

呼び出された .vue ファイルで、このメソッドを導入し、パラメータを渡します。

import { reqUserList } from '@Apis/user.api' // API をインポート
​
エクスポートデフォルト{
    名前: 'UserList',
    ……
    作成された() {
     
    },
    メソッド: {
        非同期getUsers() {
            //APIインターフェースを呼び出してパラメータを渡す const res = await reqUserList({
                ページ: 1,
                サイズ: 10
            })
            console.log(res) // 応答結果を取得する}
    }
}

このようにして、インターフェースのカプセル化と基本的な使用が完了します。

PS: 上記のファイル名、フォルダ名、メソッド名、パスなどはすべて私が取得したものです。ご自身のコーディングスタイルに合わせて調整してください。

上記は、Vue プロジェクトで axios リクエストを使用する方法の詳細です。Vue プロジェクトで axios を使用する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue プロジェクトで axios を使用して、画像のアップロードやその他のファイル操作を行う
  • Vue プロジェクトで axios を使用する詳細な説明
  • Vueプロジェクトでは、axiosクロスドメイン処理を使用します
  • Vue プロジェクトでの Axios リクエスト ネットワーク インターフェースのカプセル化のサンプル コード
  • Vue プロジェクト実践 axios のエレガントな使用
  • Vue プロジェクトでの axios の基本的な使用方法を 3 分で簡単に学習できます (推奨!)

<<:  Linux 環境の Apache サーバーでセカンダリドメイン名を設定する方法の詳細な説明

>>:  Linux 環境の Apache で https サービスを有効にする方法の詳細な説明

推薦する

MySQL マスタースレーブレプリケーションの実践の詳細説明 - GTID ベースのレプリケーション

GTIDベースのレプリケーション導入GTID ベースのレプリケーションは、MySQL 5.6 以降に...

Vueコンポーネント間の通信の非常に詳細な要約

目次序文1. Props、$emit一方向データフロー2. $親、$子3. $attrs、$list...

MySQL の DDL と DML についての簡単な説明

目次序文1. DDL 1.1 データベース操作1.2 データテーブルの操作1.3 一般的なデータ型1...

MySQL マスタースレーブレプリケーション切断の一般的な修復方法

目次01 問題の説明02 ソリューション1. 他のスレーブライブラリを見つけてすぐに置き換える2. ...

Vueは水平の斜めの棒グラフを実装します

この記事では、水平傾斜棒グラフを実装するためのVueの具体的なコードを参考までに共有します。具体的な...

CSS3 ベジェ曲線の例: リンクホバーアニメーション効果の作成

CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...

MySQL での coalesce() の使用に関するヒントのまとめ

序文最近、偶然 MySQL の coalesce を発見しました。ちょうど時間があったので、MySQ...

MySQL 8.0.13 のインストールと設定のグラフィックチュートリアル

Msyqlデータベースのインストール、参考までに具体的な内容は次のとおりです。 ①ブラウザでhttp...

詳細なハードウェア情報を取得するための Linux のいくつかのコマンドの詳細な説明

Linux システム、特にサーバー システムでは、デバイスのハードウェア情報を表示する必要がよくあり...

MySQL が UNION を使用して 2 つのクエリを接続できない理由の詳細な説明

概要連合接続データセットキーワードは、2つのクエリ結果セットを1つに連結し、同一のレコードを除外する...

MySQLデータベースはMMM高可用性クラスタアーキテクチャを実装します

コンセプトMMM (Mysql のマスター マスター レプリケーション マネージャー) は、Perl...

JavaScript はクリックして画像の形状を変更する (変換アプリケーション) を実装します。

JavaScriptをクリックすると画像の形状が変わります(変形の応用)。参考までに具体的な内容は...

InnoDB がトランザクション分離レベルを巧みに実装する方法

序文前回の記事「MySQL ロック メカニズムの詳細説明」では、InnoDB のロック メカニズムに...

一般的なMySQLストレージエンジンの長所と短所

目次すべてのストレージエンジンを表示InnoDB ストレージ エンジンMyISAM ストレージエンジ...

検索ナビゲーションバー付きの CSS サンプルコード

この記事では、CSS を使用して検索機能付きのナビゲーション バーを作成する方法を説明します。以下の...