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リモートアクセスの設定方法をステップバイステップで説明します

序文MySQL データベースを使用する場合、クライアントはデータベース サーバーにリクエストを送信す...

HTML タグでの this の使用法の紹介

例えば:コードをコピーコードは次のとおりです。 <html> <ヘッド> &...

Windows サーバー ファイルをローカルにバックアップする方法、Windows サーバー データ バックアップ ソリューション

重要なデータはバックアップする必要があり、リアルタイムでバックアップする必要があります。そうしないと...

Docker データ ストレージ ボリュームの詳細な説明

デフォルトでは、コンテナ データの読み取りと書き込みはコンテナのストレージ レイヤーで行われます。コ...

MySQL 8.0.19 winx64 インストールチュートリアルと Windows 10 での初期パスワードの変更

この記事では、参考までにMySQL 8.0.19 winx64のインストールチュートリアルを紹介しま...

MySql の 4 つのトランザクション分離レベルについて簡単に説明します。

分離レベル:隔離はあなたが考えるよりも複雑です。 SQL 標準では 4 つの分離レベルが定義されてお...

親コンテナの CSS 均等分割 (完全三分の一) の実装

親コンテナの幅は固定されています。子要素が親の幅を均等に分割するには、どのような方法がありますか?コ...

1 つの記事で MySQL のプリコンパイルを理解する

1. プリコンパイルの利点私たちは皆、プリコンパイル機能を備えた JDBC の PreparedSt...

Linux ログ表示方法 6 つのまとめ

バックエンド プログラマーは、さまざまな場所で Linux を扱います。Linux ログの読み方がわ...

英語のシングルクォーテーション「''」を含むSQLの記述の失敗について徹底解説

問題が発生しました。情報の編集をテストする際、編集した内容に一重引用符 (') が含まれてい...

Vue はモバイル端末にマルチグリッド入力ボックスを実装

最近、同社は、下図に示すように、h5 ページ操作を完了するという要件を提示しました。 ネットで入手で...

nginx プロキシ サーバーで双方向証明書検証を構成する方法

証明書チェーンを生成するスクリプトを使用して、ルート証明書、中間証明書、および 3 つのクライアント...

Docker を使用した Laravel アプリケーションのデプロイ例

この記事で使用されているPHPベースイメージはphp:7.3-apacheです。この記事の Lara...

フレームセットを使用して複雑なページレイアウトを実装するためのテクニックの概要

コードをコピーコードは次のとおりです。 <html> <!--混合フレームレイアウ...

mysql5.7でbinlogを使用してデータを復元する方法

ステップ1: MySQLでbinlogが有効になっていることを確認する '%log_bin%...