序文勉強やプロジェクトをやっていると、axiosによく遭遇します。以前やったプロジェクトではaxiosを設定していたので、大まかな印象はありました。最近、axiosを手動で設定する機会があったので、ついでに録画して共有します〜 axiosカプセル化の利点axios カプセル化の利点は、処理の統一、効率性の向上、メンテナンスの容易さです。 axiosリクエストインターフェースは次のように使用できます。 axios.get('http://localhost:10086/user?ID=12345') .then(応答 => { // 成功後の操作... }) .catch(エラー => { // 失敗後の操作... }); ただし、インターフェース要求や要件が増えると、プロジェクト内でインターフェース要求が必要なすべての場所にこのようなコードを記述すると、多くの反復コードが生成され、開発効率が低下し、メンテナンス コストが増加します。 パッケージのアイデアプロジェクトのほとんどのシナリオに構成が適応できるように、axios を一度構成する必要があります。新しい js ファイルを作成し、カスタム構成で新しい axios インスタンスを作成し、インスタンスで基本構成を実行し、リクエスト前の段階 (リクエスト本体の処理) とリクエスト後の段階 (戻り結果の処理) で必要な処理を追加して、使用するためにエクスポートすることができます。 設定の優先順位構成は優先順位に従ってマージされます。順序は、 lib/defaults.js にあるライブラリのデフォルト、インスタンスの defaults プロパティ、最後にリクエストの config パラメータです。 (このように、特別なシーンを別途処理することもできます) node_modules フォルダー内の axios ライブラリ ファイルの下にある lib/defaults.js。 カスタムインスタンスのデフォルト 定数インスタンス = axios.create({ ベースURL: 'https://api.example.com' }); 要求された設定パラメータ アクシオス({ メソッド:'get', url:'http://bit.ly/2mTM3nY', レスポンスタイプ: 'stream' }).then(function(response) { response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) }); axiosインスタンス構成1. 一般的な設定を定義するBaseUrlの設定
'axios' から axios をインポートします エクスポート const request = createAxiosInstance() 関数createAxiosInstance() { 定数インスタンス = axios.create({ ベースURL: process.env.REACT_APP_BASE_URL、 タイムアウト: 5000、 ヘッダー: { // 統合リクエストヘッダーポストを定義できます: { 'コンテンツタイプ': 'application/json' } ... } }) インスタンスを返す } 2. リクエストの前に必要な操作をいくつか追加します。たとえば、リクエストヘッダーにトークンを追加する必要があります リクエストパラメータが空の処理
インターフェースが要求されるたびにアニメーション効果の読み込みを有効にするなど。 // リクエストインターセプターを追加する(リクエストを送信する前に何かを行う) インスタンス.インターセプター.リクエスト.使用((config) => { //読み込みエフェクトを開く関数を追加できます。loading.open() //トークンが存在する場合は、それをリクエスト ヘッダー トークンに追加します && (config.headers.Authorization = token) // リクエストパラメータ内の null undefined '' 関数をフィルター cleanObject() 設定を返す }) 3. リクエストが返されたら、インターセプト操作を追加します。
たとえば、バックエンドから返されるデータは、多くのレイヤーにネストされている場合があります。必要なデータを直接返すことができるため、ビジネス コードは毎回データを分解することなく、最終データを直接取得できます。
インターフェース要求は成功する場合と失敗する場合があります。インターフェース要求を記述するたびに失敗ロジック コードを記述したくない場合、また、ほとんど常に繰り返される場合は、ここでインターフェースの統一された例外処理を集中的に実行できます。たとえば、ステータス コードまたはバックエンドのカスタマイズされたコードを判別し、バックエンドから返されたエラー プロンプトを表示します。 // レスポンスインターセプターを追加する(レスポンスデータで何かを行う) インスタンス.インターセプター.レスポンス.use((レスポンス) => { //読み込みエフェクトを閉じる関数を追加できます。loading.close() //返された結果データを分解する const res = response.data //カスタムコードを判断し、成功したデータを返します const validateStatus = /^(2|3)\d{2}$/ //2または3で始まるコードは成功したリクエストとみなされます if (validateStatus.test(res.code)) { return res // 必要なデータを直接返す } //失敗したコードを判断し、プロンプトなどを表示します。if (res.code === 401) { メッセージ.エラー(res.msg) } それ以外 { メッセージ.警告(res.msg) } Promise.reject(res) を返す }, (エラー) => { 読み込み中.閉じる() エラー応答ステータスが401の場合 message.error('トークンの有効期限が切れています。もう一度ログインしてください!') ストレージトークンを削除します。 タイムアウトを設定する(() => { window.location.href = '/ログイン' }, 2000) } それ以外 { (!window.navigator.onLine)の場合{ message.warning('ネットワーク異常です。ネットワークが正常に接続されているか確認してください') } そうでない場合 (error.code === 'ECONNABORTED') { message.warning('リクエストタイムアウト') } それ以外 { message.warning('サーバー異常です。管理者に連絡してください') } } return Promise.reject(error) // 特定のページにエラーを返す} ) HTTP ステータス コードとカスタム コードに基づいたエラー処理がいくつかあります。ここでエラーがインターセプトされると、ページがビジネス インターフェイスを呼び出すたびにエラー プロンプト処理を実行する必要がなくなります。もちろん、さまざまなプロジェクトのニーズに応じて構成する必要があります。 リクエストインターフェースメソッドの統合管理一般的に、統一された管理のためにすべてのインターフェース要求メソッドをまとめて記述します。これにより、後で変更が加えられたときに検索とメンテナンスも容易になります。 API リクエスト (apiList など) を管理するための新しいフォルダーを作成し、そこにさまざまなリクエスト ファイル (ここでは機能ごとに分割) を配置できます。たとえば、user.js にはユーザー関連のリクエストなどが保存されます。その後、ページはメソッドを直接参照してインターフェース呼び出しを行うことができます。 '../axios' から { request } をインポートします // ユーザー情報を取得するエクスポート関数 getUserInfo (userId) { request.get(`/sys/user/info/${userId}`) を返します } コンポーネントまたはページ内でメソッドを直接呼び出すだけです〜 最後に、完全な例を示します。参考にしてくださいね〜この例の設定は、vue または react に適しています。もちろん、各プロジェクトの設定は若干異なります。自分のプロジェクトに合わせて変更、拡張してください。 'axios' から axios をインポートします エクスポート const request = createAxiosInstance() 関数createAxiosInstance() { 定数インスタンス = axios.create({ ベースURL: process.env.REACT_APP_BASE_URL、 タイムアウト: 5000、 ヘッダー: { // 統合リクエストヘッダーポストを定義できます: { 'コンテンツタイプ': 'application/json' } ... } }) // リクエストインターセプターを追加する(リクエストを送信する前に何かを行う) インスタンス.インターセプター.リクエスト.使用((config) => { //読み込みエフェクトを開く関数を追加できます。loading.open() //トークンが存在する場合は、それをリクエスト ヘッダー トークンに追加します && (config.headers.Authorization = token) // リクエストパラメータ内の null undefined '' 関数をフィルター cleanObject() 設定を返す }) // レスポンスインターセプターを追加する(レスポンスデータで何かを行う) インスタンス.インターセプター.レスポンス.use((レスポンス) => { //読み込みエフェクトを閉じる関数を追加できます。loading.close() //返された結果データを分解する const res = response.data //カスタムコードを判断し、成功したデータを返します const validateStatus = /^(2|3)\d{2}$/ //2または3で始まるコードは成功したリクエストとみなされます if (validateStatus.test(res.code)) { 戻り値 } //失敗したコードを判断し、プロンプトなどを表示します。if (res.code === 401) { メッセージ.エラー(res.msg) } それ以外 { メッセージ.警告(res.msg) } Promise.reject(res) を返す }, (エラー) => { loading.close() //読み込みエフェクトを閉じる関数を追加できます if (error.response.status === 401) { message.error('トークンの有効期限が切れています。もう一度ログインしてください!') ストレージトークンを削除します。 タイムアウトを設定する(() => { window.location.href = '/ログイン' }, 2000) } それ以外 { (!window.navigator.onLine)の場合{ message.warning('ネットワーク異常です。ネットワークが正常に接続されているか確認してください') } そうでない場合 (error.code === 'ECONNABORTED') { message.warning('リクエストタイムアウト') } それ以外 { message.warning('サーバー異常です。管理者に連絡してください') } } return Promise.reject(error) // 特定のページにエラーを返す} ) インスタンスを返す } 要約するこれで、プロジェクトで axios をカプセル化する方法についての記事は終了です。関連プロジェクトで axios をカプセル化する方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Linux には make コマンドがありません (make: *** ターゲットが指定されておらず、makefile または make コマンドのインストール方法が見つかりません)
varchar の保存ルール4.0 未満のバージョンでは、varchar(20) は 20 バイトを...
注意: スコープアニメーションは使用できません。 ! ! ! GIF経由 <テンプレート>...
watch : データの変更を監視する(特定の値の変更イベント) vue2.x データ(){ 戻る ...
Vue では、ほとんどの場合、テンプレートを使用して HTML を作成することを推奨しています。ただ...
序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...
ページレイアウトは、Web ページを扱い始めた頃からずっと気にかけていたことです。初期のテーブル構造...
1. 改行を強制せず、省略記号で終了します。コードをコピーコードは次のとおりです。 <div ...
プロジェクトで frameset 属性を使用したことがあるかどうかはわかりません。昨年、オンライン ...
目次序文背景実施計画の考え方js ストレージ機能ソリューション設計やっと要約する序文どの SaaS ...
この記事では、二次リンク効果を実現するためのReactの具体的なコードを参考までに共有します。具体的...
目次1. メモリモデルとランタイムデータ領域2. マインドマップと凡例3. オブジェクトはJVMから...
モバイル デバイスでは、金額を表示するために円形の波グラフィックがよく使用されます。最初は、この効果...
1. 環境整備1.1 基本環境NTP設定: 省略 #時間の一貫性を確保するためにNTPサービスを設定...
Web ページ エンコーディングは英語では web page encoding と翻訳され、Web ...
少し前にSQLの独学を終え、MySQL 8.0.17をダウンロードしました。インストールして設定した...