Vueでaxiosをカプセル化する方法

Vueでaxiosをカプセル化する方法

1. インストール

npm install axios; // axiosをインストール

1. はじめに

'axios' から axios をインポートします

3. インターフェースルートアドレス

const baseUrl = API_BASE_URL // webpackのプラグインDefinePluginによってwebpackConfigに注入される
    .plugin('定義')
        .use(require('webpack/lib/DefinePlugin'), [{
            // NODE_ENV 環境変数、開発環境は: 'development'、テスト環境のパッケージが本番環境と一致するように、テスト環境と本番環境は両方とも 'production' です。
            'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
            // 現在のアプリケーション環境 (開発環境: 'dev'、テスト環境: 'test'、本番環境: 'prod')
            'process.env.APP_ENV': JSON.stringify(process.env.APP_ENV),
            //バックエンドインターフェースリクエストアドレス 'API_BASE_URL': JSON.stringify(config.meshProp('apiBaseUrl')),
            // ホームページパス 'APP_INDEX_PATH': JSON.stringify(indexPath),
            // ルーティングモード 'APP_ROUTER_MODE': JSON.stringify(config.meshProp('routerMode')),
            // Element コンポーネント ライブラリ 'APP_USE_ELEMENT' を使用するかどうか: JSON.stringify(config.meshProp('useElement')),

}])


config.js : システム名、API ルート パスなどを設定します。

定数パス = require('path')
定数os = require('os')
const packageName = 'focm' // プロジェクトパッケージ名 const localIP = getLocalIP() // ローカル IP アドレス module.exports = {
    //デフォルト設定 default: {
        // システム名。ページ ヘッダーのタイトルを設定するために使用されます
        アプリ名: 'xxxxx',
        // マルチページアプリケーションかどうか isMulti: false,
        // モバイル端末をサポートするかどうか isMobile: false,
        // Element コンポーネント ライブラリ (https://element.eleme.cn/#/zh-CN/) を使用するかどうか
        useElement: true、
        // ルーティング モード (値はハッシュまたは履歴、参照: https://router.vuejs.org/)
        ルーターモード: 'ハッシュ'、
        // API リクエスト ルート パス apiBaseUrl: '',
        ....
    },
    // 開発環境の設定 dev: {
        apiBaseUrl: '/api',
        ホスト: ローカルIP、
        ポート: 8080、
        autoOpenBrowser: true, // ブラウザを自動的に開くかどうか writeToDisk: false, // 生成されたファイルをディスクに書き込むかどうか proxyTable: {
            '/api': {
                ターゲット: 'http://focm-web.focms.paas.test',
                変更元: true
                }
            }
    },
    // テスト環境構成テスト: {
        // API リクエスト ルート パス apiBaseUrl: '/focm',
        出力ルート: path.resolve(__dirname, 'dist/test'),
        公開: {
            リモートホスト: 'xxxx',
            リモートポート: '22',
            リモートユーザー名: 'qinglianshizhe',
            リモートパスワード: 'xxxxxx',
            リモートアプリケーションルート: `/xxx/xxx/${packageName}`,
            ウェブURL: 'http://xxxxx.com/'
        }
    },
    // 本番環境の構成 prod: {
        ...
    }
}

// ローカルIPを取得する
関数 getLocalIP() {
    インターフェースをos.networkInterfaces()にします
    for(インターフェース内のdevName){
        iface = インターフェース[devName]とします
        for(let i=0;i<iface.length;i++){
            alias = iface[i]とします。
            if(alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal){
                alias.address を返します。
            }
        }
    }
    'localhost' を返す
}

アクシオスをカプセル化し続けよう

/**
 * ビジネス例外クラス */

クラス BusinessError は Error を拡張します {
    コンストラクタ(コード、メッセージ、データ){
        スーパー(メッセージ)
        this.code = コード
        this.name = 'ビジネスエラー'
        this.data = データ
    }
}
/**
 * システム例外クラス */
クラス SystemError は Error を拡張します {
    コンストラクタ(コード、メッセージ、データ){
        スーパー(メッセージ)
        this.code = コード
        this.name = 'システムエラー'
        this.data = データ
    }
}
// axios 設定 axios.defaults.timeout = 10000
axios.defaults.headers.post['Content-Type'] = 'application/json; charset=UTF-8'

// POSTリクエストを実行する function post (option, vm) {
    オプション.メソッド = 'POST'
    http(オプション、vm) を返す
}

// GETリクエストを実行する function get (option, vm) {
    オプション.メソッド = 'GET'
    http(オプション、vm) を返す
}

// ダウンロード要求関数 download (option, vm) {
    オプション.メソッド = オプション.メソッド || 'GET'
    オプション.isDownload = true
    オプション.responseType = 'blob'
    http(オプション、vm) を返す
    }

/**
* リクエストバックエンドインターフェース* @param オプションパラメータ* url: リクエストパス(baseUrlの後に「/」で始まり、連結されます)
* データ: リクエストパラメータオブジェクト * タイムアウト: リクエストタイムアウト (デフォルト: 10000、つまり 10 秒)
* toastError: ビジネス例外情報を自動的にプロンプ​​トします。デフォルトは true で、false の場合は自動プロンプトは表示されません。 * @param vm Vue オブジェクト (例外が発生したときにトーストで例外情報を自動的にプロンプ​​トするために使用されます)
* @return {Promise} Promiseオブジェクト */

関数 http (オプション, vm) {
    新しい Promise を返します ((resolve, reject) => {
        メソッド = オプション.メソッド || 'POST'
        url = baseUrl + option.url とします。
        タイムアウト = オプション.タイムアウト || 10000
        headers = option.headers || {} とします。
        responseType = option.responseType とします
        let data = {} // ここでデフォルト値を設定できます if (option.data) {
            if (option.data インスタンス FormData) {
                ヘッダー['Content-Type'] = 'multipart/form-data'
                formData = option.data とします
                Object.keys(data).forEach((key) => {
                    formData.append(キー、データ[キー])
                })
                データ = フォームデータ
            } それ以外 {
                データ = { ...データ、...オプションデータ }
            }
        }

        requestOptions = { メソッド、 URL、 ヘッダー、 タイムアウト、 レスポンスタイプ } とします。
        メソッドtoUpperCase()が'GET'の場合{
            requestOptions.params = データ
        } それ以外 {
            requestOptions.data = データ
        }
        axios(requestOptions).then( (res) => {
            const contentDisposition = res.headers['content-disposition']
            // ファイルのダウンロード if (contentDisposition &&
        (/filename\*=UTF-8''(.*)/.test(contentDisposition) || /filename="(.*)"/.test(contentDisposition))) { // ファイルのダウンロードの場合 const utf8Match = contentDisposition.match(/filename\*=UTF-8''(.*)/) // UTF-8 ファイル名に一致 const normalMatch = contentDisposition.match(/filename="(.*)"/) // 通常の英語ファイル名に一致 const filename = utf8Match ? decodeURIComponent(utf8Match[1]) : normalMatch[1]
                const blob = 新しい Blob([res.data])
                定数ダウンロード要素 = document.createElement('a')
                const href = window.URL.createObjectURL(blob)
                ダウンロード要素.href = href
                downloadElement.download = ファイル名
                document.body.appendChild(ダウンロード要素)
                ダウンロード要素.click()
                document.body.removeChild(ダウンロード要素)
                window.URL.revokeObjectURL(href)
                解決する
            } else { // JSON 情報 getResponseInfo(res).then((resInfo) => {
                    応答情報ハンドル(resInfo、resolve、reject、option、vm、requestOptions)
                })
            }
        }, エラー => {
            エラーハンドル(err、拒否、オプション、vm)
        }).catch(関数(エラー) {
            エラーハンドル(err、拒否、オプション、vm)
        })
    })

}

// 応答情報を処理する関数 responseInfoHandle (resInfo, resolve, reject, option, vm) {
    // リクエストは成功しましたか? let isSuccess = resInfo.retCode === '200'
    // ステータスコード let code = resInfo.retCode
    // 説明情報 let message = resInfo.retMsg || 'リクエストが失敗しました! '
    // データ let resData = resInfo.data || {}
    if (isSuccess) { // リクエスト成功console.log(`[${option.method || 'POST'}]${option.url} リクエスト成功!\nリクエストパラメータ:`, option.data, '\nレスポンス結果:', resInfo)
        解決(resData)
    } else { // ビジネス例外 console.error(`[${option.method} || 'POST']${option.url} リクエストが失敗しました!\nリクエストパラメータ:`, option.data, '\nレスポンス結果:', resInfo)
        err = new BusinessError(コード、メッセージ、resData) とします。
        エラーハンドル(err、拒否、オプション、vm)
    }
}

// レスポンス情報JSONオブジェクトを取得する function getResponseInfo (res) {
    新しい Promise を返します ((resolve, reject) => {
        // 返される情報 let resInfo = res.data
        if (resInfo インスタンスBlob) {
            const リーダー = 新しい FileReader()
            リーダー.readAsText(resInfo, 'utf-8')
            リーダー.onload = () => {
                resInfo = JSON.parse(リーダー.結果)
                解決(resInfo)
            }
        } それ以外 {
        解決(resInfo)
        }
    })
}

/* 例外処理 */
関数 errorhandle (err, 拒否, オプション, vm) {
    エラー = null とする
    if (err.name === 'BusinessError') {
        エラー = エラー
    } それ以外 {
        console.error(option.url, 'リクエストが失敗しました!', err.code, err)
        error = new SystemError(500, '申し訳ございません。システムエラーが発生しました。しばらくしてからもう一度お試しください。')
    }
    console.log('エラー = ', エラー)
    もし(VM){
        if (error.name === 'BusinessError') { // ビジネス例外 // 権限なし if (error.code === 'xxx') {
                error.ignore = true
                権限がない場合
                    vm.$popupAlert({
                        タイトル: 「ヒント」
                        メッセージ: 'ログインしていないか、セッションが期限切れです。もう一度ログインしてください。 '、
                        幅: 330,
                        高さ: 180,
                        btnText: 'もう一度ログイン',
                        オンOK: () => {
                            isShowUnauthorized = false // 再ログインポップアップボックスを表示するかどうかは true に設定
                            // ログインページに移動します。ログインに成功したら、元のパスに移動します vm.$router.push({ name: 'login', params: { fromPath: vm.$route.fullPath } })
                            vm.$eventBus.$emit('NO_AUTH_EVENT')
                        }
                    })
                    isShowUnauthorized = true // 再ログインポップアップボックスを表示するかどうかをtrueに設定します
                }
                error.ignore = true
            } そうでない場合 (option.toastError !== false) {
                vm.$toast({ タイプ: 'error'、 メッセージ: error.message })
            }
        } else { // システム異常 vm.$toast('ネットワーク異常!')
        }
    }
    拒否(エラー)
}

エクスポートデフォルト{
    ベースURL、
    http,
    役職、
    得る、
    ダウンロード
}

apiPlugin.jspluginとしてカプセル化されている

'vue' から Vue をインポートします
'@/assets/js/api.js' から api をインポートします。

エクスポートデフォルト{
    インストール () {
        Vue.prototype.$api = api
    }
}

main.js、プラグインを挿入

'./plugins/apiPlugin.js' から ApiPlugin をインポートします。

//バックエンドインターフェースプラグイン Vue.use(ApiPlugin)

4. 使用例

4.1 ダウンロード

this.$api.dow​​nload({
    URL: '/xxx/xxx/xxx',
    データ:パラメータ
}、 これ)

4.2取得

this.$api.get({
    URL: `/xxx/xxx/xx`,
    データ:パラメータ
}, this).then((res) => {
    コンソール.log(res)
})

4.3投稿

this.$api.post({
    url: '/api/basicList/query',
    データ:パラメータ
}, this).then(res => {
})

この時点で、axiosのカプセル化は基本的に完了している。

これで、Vue で axios をカプセル化する方法についての記事は終了です。Vue で axios をカプセル化する方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TypeScript を使用して Vue3 で axios をカプセル化する詳細な例
  • Vueでaxiosを簡単にカプセル化する方法
  • axiosリクエストをvueでカプセル化する方法
  • Vueでaxiosをカプセル化するいくつかの方法
  • Vue における AXIOS カプセル化の詳細な説明

<<:  WIN10 システムと Docker 内部コンテナ IP 間の通信方法

>>:  HTMLのテーブルの内容は中央に水平と垂直に表示されます

推薦する

JavaScript は詳細なコードで星座クエリ機能を実装します

目次1. タイトル2. コード3. 結果IV. 結論1. タイトルテキスト ボックスに誕生日の値を入...

DockerでLinuxシェルコマンドを実行する方法

Docker でシェル コマンドを実行するには、コマンドの前に sh -c を追加する必要があります...

Win10 MySQLでCSVをエクスポートする2つの方法

Win10 で csv をエクスポートする方法は 2 つあります。1 つ目はツールを使用することです...

vue-cli を使用してプロジェクトを作成し、webpack でパッケージ化する方法

1. 環境を準備する(Node.jsをダウンロードし、環境変数を設定する) 2. vue-cliをグ...

値の転送を実現するために、2つの同じレベルのコンポーネントをVueで作成します。

Vue コンポーネントは接続されているため、コンポーネント間で値を渡す必要があるのは避けられません...

Docker ベースの Etcd 分散デプロイメントの方法と手順

1. 環境整備1.1 基本環境NTP設定: 省略 #時間の一貫性を確保するためにNTPサービスを設定...

Windows Server 2019 IIS10.0+PHP(FastCGI)+MySQL 環境構築チュートリアル

準備1. 環境の説明:オペレーティング システム: Windows Server 2019 PHP ...

Java は Apache.POI を使用して HSSFWorkbook を Excel にエクスポートします

Apache.POI の HSSFWorkbook を使用して Excel にエクスポートします。具...

Linux の操作とメンテナンスの基本 httpd 静的 Web ページ チュートリアル

目次1. ウェアハウスを使用してhttpd lrzsz解凍ファイルを作成する2. ソースコードファイ...

MySQLの複合インデックス方式の詳細な説明

どの DBMS でも、インデックスは最適化にとって最も重要な要素です。データ量が少ない場合、適切なイ...

HTML(CSSスタイル仕様)を読む必要があります

CSS スタイル仕様1. クラスセレクター2. タグセレクター3. IDセレクター4. CSSスタイ...

MySQL 5.7.18 MSI インストール グラフィック チュートリアル

この記事では、参考までにMySQL 5.7.18 MSIインストールチュートリアルを紹介します。具体...

CSSタグの表示モードの詳細な説明

ラベル表示モード(重要) divタグとspanタグ1. スタイルはまったく同じですが、ラベルが異なり...

Nginx 設定場所のマッチング優先順位の簡単な分析

序文Nginx 構成のサーバー ブロック内の場所は、リクエスト URI を一致させるために使用され、...

Dockerでのpython3.8イメージのインストールについて

Docker Hub公式サイト1. Pythonミラーを検索するdocker 検索 python 2...