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 サービスを有効にする方法の詳細な説明

推薦する

Ubuntu 18.04 で apt-get ソースを変更する方法

apt-get を使用してインストールすると、非常に遅くなります。国内のソースを変更すると、この問題...

Apache ストレステストツールのインストールと使用

1. ダウンロードApacheの公式サイトhttp://httpd.apache.org/にアクセス...

Vue はチャット ボックスで絵文字を送信する機能を実装します

vueチャットボックスで絵文字を送信し、vueインターフェースで絵文字を送信するための具体的なコード...

mysql5.7のインストールとNavicateの長期無料利用の実施手順

(I) mysql5.7のインストール: ❀詳細:無料のグリーンバージョン5.7のインストール方法は...

mysql 起動時の ERROR 2003 (HY000) の問題を解決する方法

1. 問題の説明MYSQL を起動すると、図に示すように、「ERROR 2003 (HY000): ...

Dockerにおけるコンテナとイメージの違いについてお話ししましょう

鏡とは何ですか?イメージは、複数のイメージ レイヤー (UnionFS および AUFS ファイル ...

メニューのホバー効果を実現するCSS3

結果: html <nav id="nav-1"> <a cl...

Dreamweaver で Zen コーディングを使用する方法

前回の記事「Zen Coding: HTML/CSS コードを素早く記述する方法」を公開した後、一部...

HTML/CSS におけるフロートの使用例の詳細

1. floatの基本的な使用例1. まず 2 つの div ボックスを作成し、高さ、幅、背景色を設...

ウェブページ作成に役立つコード

<br />ホームページの右側にあるスクロールバーを削除するにはどうすればよいですか? ...

CSS--overflow:hidden のプロジェクト例

以下は、私のプロジェクトでこのプロパティを使用する方法の例です。 (1)激しく透明な浮遊コードをコピ...

デザインにおいて無視できないインタラクティブデザインにおける製品状態の分析

製品デザインのプロセスにおいて、デザイナーは常に写真を非常に美しくすることを好みます。仮想ページのコ...

Docker に共通コンポーネント (mysql、redis) をインストールする方法

Dockerはmysqlをインストールします docker search mysql 検索 dock...

Node.js パッケージ マネージャー npm の具体的な使用方法

目次目的npm init および package.json ファイルモジュールのインストールと管理モ...

HTML5で見逃せないAPIやヒントのまとめ

これまでのブログ投稿では、HTML 5 ではあまり使われていないが注目すべき API やヒントに焦点...