Vue3+TypeScript kapselt Axios und implementiert Anforderungsaufrufe

Vue3+TypeScript kapselt Axios und implementiert Anforderungsaufrufe

Auf keinen Fall. Es stellt sich heraus, dass es Leute gibt, die im Jahr 2021 noch nie von TypeScript gehört haben? Obwohl die Verwendung von TypeScript in einem Projekt kurzfristig einige Entwicklungskosten erhöht, kann TypeScript bei Projekten, die eine langfristige Wartung erfordern, die Wartungskosten senken. Die Verwendung von TypeScript erhöht die Lesbarkeit und Wartbarkeit des Codes und verfügt über eine relativ aktive Community. Da dies der Trend des großen Front-Ends ist, legen wir los~

Verwenden Sie TypeScript, um die grundlegende Axios-Bibliothek zu kapseln

Der Code lautet wie folgt:

// http.ts
importiere axios, { AxiosRequestConfig, AxiosResponse } von 'axios'
importiere { ElMessage } von "element-plus"

const showStatus = (Status: Nummer) => {
  let Nachricht = ''
  Schalter (Status) {
    Fall 400:
      Nachricht = 'Anforderungsfehler (400)'
      brechen
    Fall 401:
      Nachricht = 'Nicht autorisiert, bitte melden Sie sich erneut an (401)'
      brechen
    Fall 403:
      Nachricht = 'Zugriff verweigert (403)'
      brechen
    Fall 404:
      Nachricht = 'Anforderungsfehler (404)'
      brechen
    Fall 408:
      Nachricht = 'Zeitüberschreitung der Anforderung (408)'
      brechen
    Fall 500:
      Nachricht = 'Serverfehler (500)'
      brechen
    Fall 501:
      Nachricht = 'Dienst nicht implementiert (501)'
      brechen
    Fall 502:
      Meldung = 'Netzwerkfehler (502)'
      brechen
    Fall 503:
      Nachricht = ‚Dienst nicht verfügbar (503)‘
      brechen
    Fall 504:
      Nachricht = 'Netzwerk-Timeout (504)'
      brechen
    Fall 505:
      Nachricht = „HTTP-Version wird nicht unterstützt (505)“
      brechen
    Standard:
      Nachricht = `Verbindungsfehler (${status})!`
  }
  return `${message}, bitte überprüfen Sie das Netzwerk oder kontaktieren Sie den Administrator! `
}

const service = axios.create({
  // Gemeinsames Debuggen // baseURL: process.env.NODE_ENV === 'Produktion' ? `/` : '/api',
  Basis-URL: "/api",
  Überschriften: {
    erhalten: {
      „Inhaltstyp“: „Anwendung/x-www-form-urlencoded; Zeichensatz=utf-8“
    },
    Post: {
      „Inhaltstyp“: „Anwendung/json;Zeichensatz=utf-8“
    }
  },
  // Ob eine standortübergreifende Zugriffskontrolle mit Credentials angefordert werden soll: true,
  Zeitüberschreitung: 30000,
  transformRequest: [(Daten) => {
    Daten = JSON.stringify(Daten)
    Rückgabedaten
  }],
  validiereStatus() {
    // Bei Verwendung von async-await ist die Handhabung von Ablehnungssituationen umständlich, daher wird bei allen Rückgaben und Ausnahmebehandlungen im Geschäftscode „true“ zurückgegeben.
  },
  transformResponse: [(Daten) => {
    wenn (Datentyp === 'Zeichenfolge' und Daten.startetMit('{')) {
      Daten = JSON.parse(Daten)
    }
    Rückgabedaten
  }]
  
})

// Interceptor anfordern service.interceptors.request.use((config: AxiosRequestConfig) => {
  //Holen Sie sich das Token und fügen Sie es dem Anforderungsheader hinzu let token = localStorage.getItem('token')
  wenn(Token){
    config.headers.Authorization = `${token}`;
  }
  Konfiguration zurückgeben
}, (Fehler) => {
  // Im Geschäftscode wurde ein Fehler ausgegeben error.data = {}
  error.data.msg = ,,Serverstörung, bitte kontaktieren Sie den Administrator! '
  returniere Promise.resolve(Fehler)
})

// Antwort-Interceptor service.interceptors.response.use((response: AxiosResponse) => {
  const status = antwort.status
  lass msg = ''
  wenn (Status < 200 || Status >= 300) {
    // HTTP-Fehler behandeln und an den Geschäftscode weiterleiten msg = showStatus(status)
    wenn (Typ der Antwort.Daten === 'Zeichenfolge') {
      Antwort.Daten = { msg }
    } anders {
      Antwort.Daten.msg = Nachricht
    }
  }
  Antwort zurückgeben
}, (Fehler) => {
  wenn (axios.isCancel(Fehler)) {
    console.log('wiederholte Anfrage: ' + Fehlernachricht)
  } anders {
    // Fehlercode verarbeiten
    // Im Geschäftscode wurde ein Fehler ausgegeben error.data = {}
    error.data.msg = ,,Anforderungstimeout oder Serverausnahme, bitte überprüfen Sie das Netzwerk oder kontaktieren Sie den Administrator! '
    ElMessage.error(Fehler.Daten.Nachricht)
  }
  returniere Promise.reject(Fehler)
})

Standarddienst exportieren

Mehrere doppelte Anforderungsversionen stornieren

Fügen Sie dem obigen Code den folgenden Code hinzu:

// http.ts
importiere axios, { AxiosRequestConfig, AxiosResponse } von 'axios'
importiere qs von "qs"
importiere { ElMessage } von "element-plus"

//Deklariere eine Map, um die Kennung und die Abbruchfunktion jeder Anfrage zu speichern const pending = new Map()
/**
 * Anfrage hinzufügen * @param {Object} config 
 */
const addPending = (Konfiguration: AxiosRequestConfig) => {
  Konstanten-URL = [
    Konfigurationsmethode,
    konfiguration.url,
    qs.stringify(Konfigurationsparameter),
    qs.stringify(Konfigurationsdaten)
  ].verbinden('&')
  config.cancelToken = config.cancelToken || neues axios.CancelToken(abbrechen => {
    if (!pending.has(url)) { // Wenn die aktuelle Anfrage nicht im Pending-Modus existiert, füge sie hinzu pending.set(url, cancel)
    }
  })
}
/**
 * Anfrage entfernen * @param {Object} config 
 */
const removePending = (Konfiguration: AxiosRequestConfig) => {
  Konstanten-URL = [
    Konfigurationsmethode,
    konfiguration.url,
    qs.stringify(Konfigurationsparameter),
    qs.stringify(Konfigurationsdaten)
  ].verbinden('&')
  if (pending.has(url)) { // Wenn die aktuelle Anforderungskennung im ausstehenden Zustand vorhanden ist, müssen Sie die aktuelle Anforderung abbrechen und const cancel = pending.get(url) entfernen.
    Abbrechen (URL)
    ausstehend.Löschen(URL)
  }
}

/**
 * Ausstehende Anfragen löschen (wird beim Routing von Umleitungen aufgerufen)
 */
exportiere const clearPending = () => {
  für (const [URL, Abbrechen] von ausstehend) {
    Abbrechen (URL)
  }
  ausstehend.löschen()
}

// Interceptor anfordern service.interceptors.request.use((config: AxiosRequestConfig) => {
  removePending(config) // Bevor die Anfrage startet, die vorherige Anfrage prüfen und abbrechen addPending(config) // Aktuelle Anfrage zum Pending hinzufügen let token = localStorage.getItem('token')
  wenn(Token){
    config.headers.Authorization = `${token}`;
  }
  Konfiguration zurückgeben
}, (Fehler) => {
  // Im Geschäftscode wurde ein Fehler ausgegeben error.data = {}
  error.data.msg = ,,Serverstörung, bitte kontaktieren Sie den Administrator! '
  returniere Promise.resolve(Fehler)
})

// Antwort-Interceptor service.interceptors.response.use((response: AxiosResponse) => {

  removePending(response) // Nachdem die Anfrage abgeschlossen ist, entfernen Sie diese Anfrage const status = response.status
  lass msg = ''
  wenn (Status < 200 || Status >= 300) {
    // HTTP-Fehler behandeln und an den Geschäftscode weiterleiten msg = showStatus(status)
    wenn (Typ der Antwort.Daten === 'Zeichenfolge') {
      Antwort.Daten = { msg }
    } anders {
      Antwort.Daten.msg = Nachricht
    }
  }

  Antwort zurückgeben
}, (Fehler) => {
  wenn (axios.isCancel(error)) {
    console.log('wiederholte Anfrage: ' + Fehlernachricht)
  } anders {
    // Fehlercode verarbeiten
    // Im Geschäftscode wurde ein Fehler ausgegeben error.data = {}
    error.data.msg = ,,Anforderungstimeout oder Serverausnahme, bitte überprüfen Sie das Netzwerk oder kontaktieren Sie den Administrator! '
    ElMessage.error(Fehler.Daten.Nachricht)
  }
  returniere Promise.reject(Fehler)
})

Standarddienst exportieren

Alle Anfragen beim Routing abbrechen

Fügen Sie in der Routing-Datei index.ts hinzu

importiere { createRouter, createWebHistory, RouteRecordRaw } von 'vue-router'
Login aus '@/views/Login/Login.vue' importieren
//Führen Sie die in axios verfügbare Funktion „clearPending“ ein. import { clearPending } from "@/api/axios"

....
....
....

const router = createRouter({
  Verlauf: createWebHistory(process.env.BASE_URL),
  Routen
})

router.beforeEach((bis, von, weiter) => {
  // Vor der Umleitung alle Anfragen löschen clearPending()
  // ...
  nächste()
})

Standardrouter exportieren

Verwenden Sie die gekapselte Axios-Anforderungsbibliothek

Gekapseltes Antwortformat

//Schnittstellenantwortformat Exportschnittstelle HttpResponse {
  Status: Nummer
  StatusText: Zeichenfolge
  Daten: {
    Kennziffer
    desc: Zeichenfolge
    [Schlüssel: Zeichenfolge]: beliebig
  }
}

Kapselungsschnittstellenmethode

Um beispielsweise die Benutzeroberfläche zu kapseln, lautet der Code wie folgt ~

Axios aus „./axios“ importieren
importiere { HttpResponse } von '@/@types'
/**
 * @interface loginParams - Anmeldeparameter * @property {string} username - Benutzername * @property {string} password - Benutzerpasswort */
Schnittstelle LoginParams {
  Benutzername: Zeichenfolge
  Passwort: Zeichenfolge
}
//Kapselung der Schnittstellenmethode des Benutzertyps export class UserService {
  /**
   * @description Benutzerinformationen abfragen* @param {number} teamId - die abzufragende Team-ID
   * @return {HttpResponse} Ergebnis
   */
  statische asynchrone Anmeldung (Parameter: LoginParams): Promise<HttpResponse> {
    return Axios('/api/Benutzer', {
      Methode: 'get',
      Antworttyp: "json",
      Parameter: {
        ...Parameter
      },
    })
  }

  statische asynchrone Registrierung (Parameter: LoginParams): Promise<HttpResponse> {
    return Axios('/api/user/registrier', {
      Methode: 'get',
      Antworttyp: "json",
      Parameter: {
        ...Parameter
      },
    })
  }
}

Einsatz in Projekten

Der Code lautet wie folgt:

<Vorlage>
     <input type="text" v-model="Konto" placeholder="Bitte geben Sie Ihre Kontonummer ein" name="Benutzername" >
     <input type="text" v-model="Passwort" placeholder="Bitte geben Sie Ihr Passwort ein" name="Benutzername" >
     <button @click.prevent="handleRegister()">Anmelden</button>
</Vorlage>
<script lang="ts">
importiere { defineComponent, reaktiv, toRefs } von 'vue'
//Schnittstelle importieren import { UserService } von '@/api/user'

exportiere StandarddefiniereKomponente({
  aufstellen() {
    const state = reaktiv({
      Konto: 'admin', //Konto-Passwort: 'hhhh', //Passwort})

    const handleLogin = async () => {
      const loginParams = {
        Benutzername: state.Account,
        Passwort: state.Password,
      }
      const res = warte auf UserService.login(loginParams)
       Konsole.log(res)
    }

    const handleRegister = async () => {
      const loginParams = {
        Benutzername: state.Account,
        Passwort: state.Password,
      }
      const res = warte auf UserService.resgister(loginParams)
      Konsole.log(res)
    }
    zurückkehren {
      …toRefs(Zustand),
      handleLogin,
      handleRegistrieren 
    }
  },
})
</Skript>

Dies ist das Ende dieses Artikels über die Vue3+TypeScript-Kapselung von Axios und die Implementierung von Anforderungsaufrufen. Weitere relevante Inhalte zur Vue3+TypeScript-Kapselung von Axios finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • So kapseln Sie Axios-Anfragen mit Vue
  • Beispielcode einer Vue-Anwendung basierend auf der Axios-Anforderungskapselung
  • So kapseln Sie Axios in ein Vue-Projekt (einheitliche Verwaltung von HTTP-Anfragen)
  • Vue+axios kapselt Anfragen, um Front- und Backend zu trennen
  • Schritte für Vue zum Kapseln von Axios-Anfragen und -Interceptors
  • So verwenden Sie Axios zum Kapseln von HTTP-Anfragen in Vue-Projekten
  • Vue Axios wiederholtes Klicken bricht die letzte Anforderungskapselungsmethode ab
  • Kapselungsanforderung von Axios im Vue-Projekt

<<:  Linux führt jeden Tag eine automatische und geplante Sicherung der MySQL-Datenbank durch

>>:  Erläuterung zur Optimierung der Tomcat+MySQL-Konfiguration mit hoher Parallelität

Artikel empfehlen

Die Hintergrundfarbe oder das Bild im Div-Container wächst mit dem Wachstum

Code kopieren Der Code lautet wie folgt: Höhe: au...

So erstellen Sie ein CentOS-Basisimage

Vorwort Derzeit ist das von meiner Firma verwende...

Linux Cron geplante Ausführung von PHP-Code mit Parametern

1. Verwenden Sie zur Ausführung weiterhin ein PHP...

Einführung in die Apache-Bereitstellung von https in der Kryptografie

Inhaltsverzeichnis Zweck Experimentelle Umgebung ...

Vue verwendet Filter zum Formatieren von Daten

In diesem Artikelbeispiel wird der spezifische Co...

Der Unterschied zwischen MySQL-Datenbankhost 127.0.0.1 und localhost

Viele meiner Freunde haben möglicherweise ein Pro...

Tabelle der durch hasLayout verursachten CSS-Fehler

Der IE hat schon seit längerem Probleme. Als alle ...

Detaillierte Erklärung zu Padding und Abkürzungen im CSS-Boxmodell

Wie oben gezeigt, sind Füllwerte zusammengesetzte...

So deklarieren Sie einen Cursor in MySQL

So deklarieren Sie einen Cursor in MySQL: 1. Vari...

Probleme und Lösungen bei der Verwendung der jsx-Syntax in React-vscode

Problembeschreibung Nach der Installation des Plu...

Beispiel und Update für die Erstellung von HTML5+CSS3-Headern

Beim letzten Mal haben wir uns zwei Header-Layout...