TypescriptとAxiosに基づくインターフェースリクエスト管理の詳細な説明

TypescriptとAxiosに基づくインターフェースリクエスト管理の詳細な説明

この記事では主にTSとAXIOSに基づくインターフェース要求のカプセル化について紹介します。

アイデア

傍受を要求する

  • リクエスト ヘッダーにトークン、uid などのいくつかのパラメータを追加します。
  • ユーザーのログイン状態を確認します。ログインしていない場合は、直接ログインに進みます。
  • リクエストデータを処理し、送信するリクエストのデータ形式をjson→urlencodedに変換します(オプション)

レスポンスインターセプション

  • バックエンドレスポンスのビジネスステータスコードを判定し、異なる処理を実行する
    • たとえば、ユーザーのログインステータスが期限切れになった場合は、直接ログイン画面にジャンプします。
    • 統合エラー報告

まずルーチン コードを記述します。

axios をインポートします。{
    Axiosインスタンス、
    アクシオスレスポンス、
    Axiosリクエスト構成、
    アクシオスエラー
} 'axios' より
デフォルトの抽象クラス HttpClient をエクスポートします。
    保護された読み取り専用インスタンス: AxiosInstance

    パブリックコンストラクタ(baseURL = '/api'、タイムアウト = 1000 * 120) {
        this.instance = axios.create({
            ベースURL、
            タイムアウト
        })
        // 1. リクエストインターセプター this._initializeRequestInterceptor()
        // 2. レスポンスインターセプター this._initializeResponseInterceptor()
    }
    プライベート_initializeRequestInterceptor = () => {
        this.instance.interceptors.request.use(
            this._handleRequest、
            this._handleError
        )
    }
    プライベート _handleRequest = (設定: AxiosRequestConfig) => {}
   
    プライベート_initializeResponseInterceptor = () => {
        this.instance.interceptors.response.use(
            this._handleResponse、
            this._handleError
        )
    }
    プライベート _handleResponse = (レスポンス: AxiosResponse) => {}
    保護された _handleError = (エラー: AxiosError) => Promise.reject(エラー)
}

上記のコードについて簡単に説明すると、リクエストインターフェース用の HttpClient クラスを作成し、コンストラクタで baseURL と timeout を定義し、リクエストインターセプトメソッドとレスポンスインターセプトメソッドを定義しました。

この時点で、インターフェースを開始するプロセスは次のようになります。

  1. リクエストを送信する前に、リクエストインターセプションを呼び出す
  2. 送信インターフェース、ネットワーク要求が表示される
  3. インターフェース応答、通話応答傍受
  4. フロントエンドプログラムに応答し、対応するロジックを実行する

傍受を要求する

詳細なロジックから始めましょう。傍受を要求するときは、次の操作を実行できます。

  1. リクエスト ヘッダーにトークン、uid などのいくつかのパラメータを追加します。
  2. ユーザーのログイン状態を確認します。ログインしていない場合は、直接ログインに進みます。
  3. リクエストデータを処理し、送信するリクエストのデータ形式をjson→urlencodedに変換します(オプション)
     プライベート _handleRequest = (設定: AxiosRequestConfig) => {
        //1. カスタムリクエストヘッダーを追加する config.headers['Authorization'] = 'my token'
        config.headers['mobile'] = '私のモバイル'
        //2. ログインするかどうかを判定する(トークンがあるかどうかを判定)
        
        //3. データ形式を変換する config.data = qs.stringify(config.data)
        設定を返す
    }

レスポンスインターセプション

応答を取得した後のプロセスは次のようになります。

  • バックエンドレスポンスのビジネスステータスコードを判定し、異なる処理を実行する
    • ユーザーのログインステータスが期限切れの場合は、直接ログインにジャンプします
    • 統合エラー報告
  • トークンを保存
 // レスポンスインターセプター private _handleResponse = (response: AxiosResponse) => {
        const { データ、ヘッダー } = レスポンス

        //1.--レスポンストークンを処理して保存する
        const トークン = ヘッダー['authorization']
        if (トークン) {
            this._saveToken(トークン)
        }
       
        //2. -- 応答コードを処理し、ここで try-catch を実行します。バックエンド インターフェースがコードを返さない場合は、直接 try { に戻ります。
            定数コード = データ.コード、
            メッセージ = data.desc || data.msg
            const isSucceed = this._handleResCode(コード、メッセージ、URL)
            if (isSucceed) {
                Promise.resolve(data) を返します。
            } それ以外 {
                Promise.reject(メッセージ) を返します。
            }
        } キャッチ(エラー){
            Promise.resolve(data) を返します。
        }
       
    }
    //トークンを保存
    プライベート_saveToken(トークン: 文字列) {
        定数 USER = getModule(UserModule)
        USER.setToken(トークン)
    }
    プライベート_handleResCode(コード: 数値、メッセージ: 文字列、URL: 文字列) {
        (コード === 0) の場合 {
            // リクエストが成功した場合は true を返す
        } そうでない場合 (コード===4000) {
            // トークンの有効期限が切れたので、ログインインターフェースに戻ります Vue.prototype.$message.error('ID情報の有効期限が切れました。もう一度ログインしてください')
            router.push({ name: 'ログイン' })
            偽を返す
        } それ以外 {
            // それ以外の場合、すべてのプロンプトはメッセージ情報です Vue.prototype.$message.error(message)
            偽を返す
        }
    }

httpClient.tsを使用してリクエストを定義する

リクエスト関連のファイルは、次のように@/apiディレクトリに定義することをお勧めします。

httpクライアント
ユーザー.ts
uti.ts

対応するファイルでリクエストを定義し、

  1. すべてのリクエスト クラスは HttpClient クラスを継承する必要があります。HttpClient は、リクエストと応答の統一されたインターセプションと統一された処理を実行します。
  2. リクエスト応答のデータには、@/types/xxx ファイルで定義されているタイプを指定する必要があります。1 つのモジュールは 1 つのファイルに対応します。タイプが指定されている場合にのみコードヒントが表示されます
'./HttpClient' から HttpClient をインポートします。
'../types/test' から { AlarmItemType } をインポートします。
'../types/index' から { BaseResType } をインポートします

クラス UtilApi は HttpClient を拡張します {
   //たとえば、バックグラウンドで返されるレスポンス res={code:xxx,data:xxx,token:xxx,desc:xxx}
    //まず、res.data の型を定義する必要があります。これは get の最初のパラメータで、AlarmItemType です。
    //次に、応答全体のタイプを定義する必要があります。これは BaseResType<AlarmItemType> です。
    パブリック getAlarmById = (id: 文字列) =>
        this.instance.get<アラームアイテムタイプ、BaseResType<アラームアイテムタイプ>>(
            `/realtime/alarms/queryByAlarmId/${id}`
        )
}

エクスポート const UTIL_API = 新しい UtilApi()

コンポーネント内のインターフェースの要求

USER_API など、リクエストを送信するコンポーネントにリクエスト モジュールのキーワードを入力します。TypeScript Importer プラグインがインストールされている場合は、対応するモジュールのインポート プロンプトが表示されます。このとき、Enter キーを押して対応するモジュールをインポートします。

<テンプレート>
    <section>リクエストデータ:{{alarmData}}</section>
</テンプレート>

<script lang="ts">
'@/api/utilApi' から {UTIL_API} をインポートします。
'vue-property-decorator' から { Vue, Component } をインポートします。
@成分({
    コンポーネント: {}
})
デフォルトのクラスTestRequestをエクスポートし、Vueを拡張します。
    アラームデータ = {}
    非同期getAlarmData() {
        const res = UTIL_API.getAlarmById('alarmIdc7e9bd47') を待機します
        (res.code == 0)の場合{
            this.$message.success('リクエストは成功しました')
            this.alarmData = res.data
        }
    }
    マウント() {
        this.getAlarmData()
    }
}
</スクリプト>
<style lang="scss" スコープ></style>

要約する

Typescript と Axios に基づくインターフェース リクエスト管理に関するこの記事はこれで終わりです。Typescript と Axios のインターフェース リクエストに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TypeScript インターフェース定義ケースチュートリアル
  • TypeScript のジェネリック使用法とジェネリックインターフェースの組み合わせ
  • TypeScript インターフェースの紹介
  • TypeScript 入門 - インターフェース
  • TypeScriptのインターフェースの詳細な説明
  • TypeScript コア基盤インターフェース

<<:  VMware15.5 インストール Ubuntu20.04 グラフィック チュートリアル

>>:  Ubuntu 20.04 は Wi-Fi に接続します (2 つの方法)

推薦する

MySQL 8.0.20でNavicatをインストールして接続する方法と注意すべき点

注意事項1. まず、mysql インストール ディレクトリに次の内容の my.ini ファイルを作成...

webpackコード断片化の実装

目次背景コモンズチャンクプラグイン分割チャンク構成リソースを非同期に読み込む要約する背景高性能なアプ...

CSSはボックスコンテナ(div)の高さを常に100%に設定します。

序文ブラウザをどのようにズームしても、ボックス コンテナーの高さを常に 100% に保つ必要がある場...

Tomcat9 Windows サービスのインストールに関する詳細なチュートリアル

1. 準備1.1 service.bat を含む tomcat 圧縮パッケージをダウンロードします。...

ページのスクロールバーを無効にするには、overflow: hiddenを使用します。

コードをコピーコードは次のとおりです。 html {オーバーフロー: 非表示; }体{オーバーフロー...

Linux で FastDFS を使用してイメージ サーバーを構築する

目次サーバー計画1. システムコンポーネントをインストールする2. fastdfsをインストールする...

Tomcat が IDEA のコンソールで文字化けを起こし、IDEA エンコーディングを UTF-8 に設定する方法

1. まず、TomcatログのエンコーディングとIdeaログ表示コンソールのエンコーディングを区別す...

Linux ディスクのシーケンシャル書き込みとランダム書き込みの方法

1. はじめに● ランダム書き込みではヘッドがトラックを頻繁に変更するため、効率が大幅に低下します。...

Vue でバイナリ ファイル ストリームを受信して​​ PDF プレビューを実現する方法

バックグラウンド コントローラー @RequestMapping("/getPDFStre...

JSでよく使われるデータ処理方法

目次DOM処理配列方法要約するDOM処理DOM はドキュメントの構造化された表現を提供し、スクリプト...

WeChatミニプログラムマップの使い方を詳しく解説

この記事の例では、WeChatアプレットマップで使用される具体的な実装コードを参考までに共有していま...

MySql SQL最適化のヒントの共有

ある日、内部結合を含む SQL ステートメントの実行速度はそれほど遅くはない (0.1 ~ 0.2)...

シンプルな虫眼鏡効果を実現するJavaScript

大きな箱の中に写真があります。マウスをその上に置くと、半透明のマスク レイヤーが表示されます。マウス...

tomcat+nginx を使用してマルチアプリケーション デプロイメントを実装するためのサンプル コード

目次マルチアプリケーションの展開1-Tomcat 構成1.1- プロジェクト構成1.2-サービス構成...