uniappがインターフェースドメイン名を動的に取得する方法を分析する

uniappがインターフェースドメイン名を動的に取得する方法を分析する

背景

インターフェイス ドメイン名はハードコードされておらず、動的に取得されます。具体的な実装は、静的な json ファイルを読み取って実際のインターフェース ドメイン名を設定することです。利点は、元のドメイン名がブロックされる可能性があるため、バックグラウンドで構成ファイルを直接変更できることです。それ以外の場合は、h5 プロジェクトは問題ないかもしれませんが、アプリを再リリースする必要があります。

コード

// httpService.js は uni.request をカプセル化します。

データ要求の入り口では、まずドメイン名が取得され、つまりconfig.requestRemoteIpメソッドが実行されます。

'@/config' から設定をインポートします
'vue' から Vue をインポートします
'@/service/cacheData.js' から cacheData をインポートします。
const MockUtil = () => import('@/libs/mockUtil.js')
'@/libs/storage.js' からストレージをインポートします。

クラス HttpRequest {

    /**
     * インターフェースデータを読み取ります * @param options リクエスト情報 * @param noMock モックデータを全体として使用する場合、実際のデータをリクエストするための別のインターフェースを設定できます * @param cacheId
     * @returns {*}
     */
    非同期リクエスト解決(オプション、urlCustom = '', noMock = false, cacheId = null) {
        let remoteIP = await config.requestRemoteIp(); // インターフェースリクエストドメイン名を動的に設定する if (process.env.NODE_ENV === 'development' && config.isMockApi && !noMock) {
            this.getMockData(オプション) を返します
        }
        if (cacheId && cacheData[cacheId]) {
            this.testHttp(cacheData[cacheId]) を返します。
        }
        新しい Promise を返します ((resolve, reject) => {
            baseUrl を process.env.NODE_ENV === 'development' とします。config.baseUrl.dev : config.baseUrl.pro;
            options.url = baseUrl + options.url + `${urlCustom}`;
            ユニ.リクエスト(
                オブジェクト.assign({
                    成功: (res) => {
                        (res.statusCode != '200')の場合{
                            uni.showToast({
                                タイトル: 'サーバーエラー:' + res.statusCode、
                                アイコン:「なし」
                            })
                            拒否する()
                        }
                        そうでない場合 (res.data.code == 10001) {
                            ストレージ.removeToken();
                            Vue を新しい Vue() にします。
                            vue.$store.dispatch('ログアウト')
                            vue.$routeUtil.reLaunch('main');
                        }
                        
                        そうでない場合 (res.data.code != 200) {
                            (res.data.message)の場合{
                                uni.showToast({
                                    アイコン: 'なし'、
                                    タイトル: res.data.message
                                });
                            }
                            拒否(res.data)
                        } それ以外 {
                            if (キャッシュID) {
                                キャッシュデータ[キャッシュID] = res.data.data
                            }
                            解決(res.data.data)
                        }
                    },
                    失敗: エラー => {
                        uni.showToast({
                            タイトル: 「サーバーエラー」
                            アイコン:「なし」
                        })
                    }
                }、オプション)
            );
        })
    }

    /**
     *モックデータは必要に応じてインポートされます* @param options
     * @returns {*}
     */
    非同期getMockData(オプション) {
        const モック = MockUtil() を待機します
        const MockUrl = Mock.default[options.url]
        if (typeof MockUrl !== 'function') {
            this.testHttp(MockUrl) を返します
        }
        if (options.method === 'post') {
            this.testHttp(MockUrl(options.data, false)) を返します
        }
        this.testHttp(MockUrl(options.params, true)) を返します
    }
    testHttp(データ) {
        pro = new Promise(function(resolve, reject) { とする
            setTimeout(関数() {
                解決(データ)
            }, 50)
        })
        リターンプロ
    }
}
デフォルトの新しい HttpRequest() をエクスポートします

// config.js

定数設定 = {
  isMockApi: false、
  // リクエスト URL: 'http://qiniu.eightyin.cn/teacherpath.json?time=' + Math.random().toString(36),
  リクエストURL: 'http://qiniu.eightyin.cn/teacherpathtest.json?time=' + Math.random().toString(36),
  ベースURL: {
     
    開発者: ''、
    プロ: ''
  },
  画像: {
    ossドメイン: ''
  },
  uuid: Math.random().toString(36).substring(3, 20),
  リクエストリモートIP: () => {
      コンソールログ('config:', config)
      (config.RemoteIpInited) の場合
        Promise.resolve() を返します。
        新しい Promise を返します ((resolve, reject) => {
            uni.リクエスト({
                URL: config.requestUrl、
                成功: (応答) => {
                    //todo テスト // config.baseUrl.pro = response.data.data.path;
                    config.baseUrl.dev = 'http://bayin5.mycwgs.com/';
                    config.img.ossDomain = response.data.data.ossDomain;
                    config.RemoteIpInited = true;
                    解決する()
                },
                失敗: () => {
                    config.RemoteIpInited = true;
                    解決する()
                }
            })
        });
  }
}

デフォルト設定をエクスポート

上記は、uniapp がインターフェイスドメイン名を動的に取得する方法の詳細な分析です。uniapp がインターフェイスドメイン名を動的に取得する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • uniapp プロジェクトの最適化方法と提案
  • vscodeを使用してuniappを開発する方法
  • uniapp パッケージ化されたアプレット レーダー チャート コンポーネントの完全なコード
  • uniappを使用してWeChatミニプログラムでEChartsを使用する方法
  • uniapp 要素ノードスタイルの動的変更の詳細な説明

<<:  SQL ステートメント実行の詳細な説明 (MySQL アーキテクチャの概要 -> クエリ実行プロセス -> SQL 解析順序)

>>:  Zabbix 監視ソリューション - 最新の公式バージョン 4.4 [推奨]

推薦する

ウェブサイトのフッター沈下現象に対する3つの解決策を詳しく解説

背景多くのウェブサイトのデザインは、一般的にコンテンツ+フッターの2つの部分で構成されています。コン...

MySQL の異常なエラー ERROR: 2002 を解決する方法

最近、MySQL の起動中にエラーが発生しました。エラー メッセージは次のとおりです。 エラー 20...

Springboot アプリケーションを迅速にデプロイするために Docker とアイデアを統合する詳細なプロセス

目次1. はじめに2. 環境とツール3. Dockerをインストールし、リモート接続を構成する4. ...

ウェブデザインの概要

<br />1998年に最初の個人ページが誕生してから2008年の今日まで、デザイン業界...

Docker のタイムゾーンの問題とデータ移行の問題

最新のソリューション: -v /usr/share/zoneinfo/Asia/Shanghai:/...

読み取り専用と無効の違い

要約すると: Readonly は入力 (テキスト/パスワード) とテキスト領域に対してのみ有効です...

Reactでプロキシを有効にする2つの実用的な方法

プロキシを有効にする2つの方法React には、直接使用できるカプセル化された Ajax リクエスト...

Nginx 外部ネットワーク アクセス イントラネット サイト構成操作

背景:サイトはフロントエンドとバックエンドから分離されています: vue+springbootフロン...

Vue のドロップダウン ボックスのセカンダリ リンク効果を実装するためのサンプル コード

1. 成果を達成する 2. バックエンドから返されるデータ形式 「リスト」: [ { "i...

CentOS7.3 での MySQL 8.0.13 のインストールと設定のチュートリアル

1. 基本環境1. オペレーティングシステム: CentOS 7.3 2. MySQL: 8.0.1...

MySQL 5.5.56 インストール不要版の設定方法

MySQL 5.5.56無料インストール版の設定方法をテキストコードで詳しく説明します。具体的な内容...

Linux でログインタイムアウト後に非アクティブなユーザーを自動的にログアウトする

方法1: .bashrcまたは.bash_profileファイルを変更するこれは、ホーム ディレクト...

CSS メニューボタンアニメーション

ドロップダウンメニューを書くには、ボタンをクリックします。メニューの入り口はアイコンボタンをクリック...

Linux チェックアップ、Linux の状態 (ネットワーク IO、ディスク、CPU、メモリ) を把握

目次1. コアコマンド2. 共通コマンド3. コアコマンドの詳細な説明3.1、ps補助3.2 トップ...

シンプルな CSS テキストアニメーション効果

成果を達成する 実装コードhtml <div id=コンテナ> いらっしゃいませ <...