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 データベースを強制終了します (推奨)

朝早くに電話で起こされました。あるプロジェクトのデータベースがダウンしていて起動できないとのことでし...

最新の JavaScript で非同期タスクを書く方法

序文この記事では、非同期 JavaScript の進化と、それがコードの記述方法にどのような変化をも...

mysql5.7.19 winx64 解凍版のインストールと設定のチュートリアル

mysql 5.7.19 winx64解凍版のインストールチュートリアルを収録しました。具体的な内容...

Reactの親コンポーネントと子コンポーネント間のデータ転送の詳細な説明

目次1. 親コンポーネントが子コンポーネントにデータを渡す1.1. 親コンポーネントコード1.2. ...

MYSQL8.0.13 無料インストール版 設定チュートリアル例 詳細説明

1. ダウンロード、例として8.0を取り上げますダウンロードアドレス: https://dev.my...

CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)

【コンテンツ】: 1.背景画像のグラデーションスタイルを使用する2. スケールを使ってズームできる...

Portainer を使用した Docker コンテナのデプロイのプロジェクト実践

目次1. 背景2. 操作手順3. Portinerをインストールする3.1 Dockerのデプロイメ...

JS がビデオ弾幕効果を実現

これを実現するには、ES6 モジュール開発とオブザーバー モードを使用します。オブザーバー パターン...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

JavaScript はモーダルボックスのドラッグ効果を実現します

これはモーダル ボックスのドラッグのケースです。ここで実装する関数は次のとおりです。 1. ポップア...

MySQL 5.7 でパスワードを変更するときに発生する ERROR 1054 (42S22) の解決方法

MySQL 5.7 を新しくインストールしました。ログインすると、パスワードが間違っているというメッ...

HTML ページの先頭に戻るいくつかの実装の概要

最近、ウェブサイトを開発する際にトップに戻るボタンを作成する必要がありますが、私は主にバックエンドの...

dockerでPostgreSQLを実行する方法

1. Dockerをインストールします。参考URL: Docker 入門インストールチュートリアル ...

Dockerコンテナでユーザーを分離する方法

前回の記事「Docker コンテナの UID と GID を理解する」では、Docker コンテナ内...

Vue ダイナミック バインディング アイコンの完全な手順

0 アイコンと画像の違いアイコンは文字であり、画像はバイナリ ストリームです。つまり、画像はアイコン...