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

Vertieftes Verständnis des Implementierungsprinzips des Require Loader

Vorwort Wir sagen oft, dass Node keine neue Progr...

MySQL-Schritte vollständig löschen

Inhaltsverzeichnis 1. Stoppen Sie zuerst den MySQ...

Zusammenfassung des Front-End-Wissens im Gokudō-Spiel

Hintergrund Zu Beginn meines Japanisch-Lernens fi...

So ändern Sie den Benutzer und die Gruppe einer Datei in Linux

Wenn unter Linux eine Datei erstellt wird, ist de...

Detaillierte Schritte zur Implementierung der Excel-Importfunktion in Vue

1. Front-End-geführte Implementierungsschritte De...

JS implementiert den Beispielcode der Dezimalkonvertierung in Hexadezimal

Vorwort Beim Schreiben von Code stoßen wir gelege...

MySQL verwendet Aggregatfunktionen zum Abfragen einer einzelnen Tabelle

Aggregatfunktionen Wirkt auf einen Datensatz ein ...