Detaillierte Erläuterung der Axios-Kapselung und des API-Schnittstellenmanagements im React-Projekt

Detaillierte Erläuterung der Axios-Kapselung und des API-Schnittstellenmanagements im React-Projekt

Vorwort

Im React-Projekt verwenden wir normalerweise die Axios-Bibliothek, um mit dem Hintergrund zu interagieren und Daten abzurufen. Es handelt sich um eine versprechenbasierte HTTP-Bibliothek, die im Browser und in node.js ausgeführt werden kann. Es verfügt über viele hervorragende Funktionen, wie das Abfangen von Anfragen und Antworten, das Abbrechen von Anfragen, die Konvertierung von JSON und den Schutz vor XSRF auf der Clientseite. Wenn Sie Axios noch nicht kennen, können Sie zur Axios-Dokumentation wechseln.

Installieren

//Mit npm installieren npm install axios; 
//Verwenden Sie yarn, um yarn add axios zu installieren

Einführung

Erstellen Sie im Stammverzeichnis des Projekts einen Anforderungsordner und erstellen Sie darin dann eine Datei „index.js“ und eine „api.js“. Die Datei index.js wird zum Kapseln unserer Axios verwendet und api.js dient zur einheitlichen Verwaltung unserer Schnittstellen.

//Axios in index.js einführen
importiere Axios von „Axios“;
//Führen Sie das QS-Modul ein, um Post-Type-Daten zu serialisieren. Importieren Sie QS von „qs“.
//Antds Nachrichtenaufforderungskomponente, Sie können sie entsprechend Ihrer eigenen UI-Komponente ändern.
importiere {Nachricht} von 'antd'

Umgebungen wechseln

Unsere Projektumgebung kann eine Entwicklungsumgebung, eine Testumgebung und eine Produktionsumgebung umfassen. Wir verwenden die Umgebungsvariablen des Knotens, um sie an das URL-Präfix unserer Standardschnittstelle anzupassen. Hier wird die globale Variable process des Knotens benötigt, process.env.NODE_ENV kann unterscheiden, ob es sich um eine Entwicklungsumgebung oder eine Produktionsumgebung handelt.

//Umgebungsvariablen speichern const isPrd = process.env.NODE_ENV == 'production';

//Unterscheiden Sie zwischen der Basis-URL der Entwicklungsumgebung und der Produktionsumgebung
export const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

Um zu verhindern, dass an anderer Stelle andere Ressourcen verwendet werden, wird hier die Basis-URL exportiert. Dabei ist zwischen Produktionsumgebung und Entwicklungsumgebung zu unterscheiden. Nach dem Import kann diese direkt verwendet werden.

Abfangen von Anfragen

Wir können eine Anfrage abfangen, bevor wir sie senden. Warum müssen wir sie abfangen? Wozu fangen wir die Anfrage ab? Bei manchen Anfragen ist beispielsweise eine Anmeldung des Benutzers erforderlich, bevor er darauf zugreifen kann. Bei einer Post-Anfrage müssen wir die übermittelten Daten serialisieren. Zu diesem Zeitpunkt können wir die Anfrage vor dem Senden abfangen und die gewünschten Vorgänge ausführen.

//Den Axios-Basispfad festlegen const service = axios.create({
  baseURL: Basis-URL
})
// Interceptor anfordern service.interceptors.request.use(config => { 
  // Überprüfen Sie vor dem Senden jeder Anfrage, ob sich ein Token im lokalen Speicher befindet. Sie können hier auch Redux verwenden, um nur zu demonstrieren, wie Sie das Token lokal erhalten.
  // Falls vorhanden, füge das Token dem Header der http-Anfrage hinzu, damit das Backend deinen Login-Status anhand des Tokens ermitteln kann. // Auch wenn das Token lokal vorhanden ist, ist es möglich, dass das Token abgelaufen ist, daher muss der Rückgabestatus im Antwort-Interceptor ermittelt werden const token = window.localStorage.getItem('userToken') || window.sessionStorage.getItem('userToken');
  //Jeder Anfrage ein Token hinzufügen
  config.data = Objekt.assign({}, config.data, {
    Zeichen: Zeichen,
  })
  //Setze den Anforderungsheader config.headers = {
    „Inhaltstyp“: „Anwendung/x-www-form-urlencoded; Zeichensatz=utf-8“
  }
  Konfigurationsdaten = QS.stringify(Konfigurationsdaten)
  Konfiguration zurückgeben
}, Fehler => { 
    Rückgabefehler;
})

Lassen Sie uns hier über Token sprechen. Im Allgemeinen wird das Token des Benutzers nach Abschluss der Anmeldung lokal über localStorage oder sessionStorage gespeichert. Jedes Mal, wenn der Benutzer dann die Seite aufruft (d. h. in main.js), wird das Token zuerst aus dem lokalen Speicher gelesen. Wenn das Token vorhanden ist, bedeutet dies, dass sich der Benutzer angemeldet hat. Anschließend wird der Token-Status in Redux aktualisiert. Dann haben Sie bei jeder Anforderung der Schnittstelle das Token im Anforderungsheader dabei. Das Backend-Personal kann anhand des Tokens, den Sie dabei haben, feststellen, ob Ihr Login abgelaufen ist. Wenn Sie es nicht dabei haben, bedeutet dies, dass Sie sich nie angemeldet haben.

Antwortabfangen

// Antwort-Interceptor service.interceptors.response.use(response => {
  //Machen Sie unterschiedliche Dinge basierend auf dem zurückgegebenen Statuscode// Verhandeln Sie unbedingt mit den Backend-Entwicklern einen einheitlichen Fehlerstatuscode, wenn (response.code) {
    Schalter (Antwortcode) {
      Fall 200:
        Antwortdaten zurückgeben;
      Fall 401:
        //Nicht angemeldet bei der Verarbeitungsmethode „break“;
      Fall 403:
        //Methode zur Verarbeitung des Token-Ablaufs break;
      Standard:
        Nachricht.Fehler(Antwort.Daten.Nachricht)
    }
  } anders { 
    Antwort zurückgeben;
  }
})
//Exportieren Sie abschließend den gekapselten Axios-Export-Standarddienst

Der Antwort-Interceptor ist leicht zu verstehen. Es sind die Daten, die der Server an uns zurückgibt, und wir können sie verarbeiten, bevor wir sie erhalten. Die obige Idee lautet beispielsweise: Wenn der vom Hintergrund zurückgegebene Statuscode 200 ist, werden die Daten normal zurückgegeben, andernfalls werden einige Fehler, die wir benötigen, entsprechend dem falschen Statuscodetyp verarbeitet. Die spezifischen Prozesse, die entsprechend dem zurückgegebenen Statuscode behandelt werden müssen, müssen mit den Hintergrundentwicklern ausgehandelt werden.

Die obige Methode message.error() ist die von mir eingeführte Bibliotheks-Prompt-Komponente von antd. Sie müssen die Prompt-Komponente entsprechend Ihrer UI-Bibliothek verwenden.

Einheitliche Verwaltung von APIs

Eine übersichtliche API ist wie eine Leiterplatte, die die gesamte Schaltung klar darstellt, egal wie komplex sie ist. Wie oben erwähnt, erstellen wir eine neue Datei „api.js“ und speichern alle unsere API-Schnittstellen in dieser Datei.

Zunächst stellen wir unsere gekapselten Axios in api.js vor

//Importieren Sie unsere verpackten Axios 
Dienst aus „./index“ importieren

Jetzt haben wir beispielsweise eine solche Schnittstelle, die eine Post-Anfrage ist:

http://www.development.com/api/v1/articleEdit

Wir können es wie folgt in api.js kapseln:

export const apiArticleEdit = info => service.post('/api/v1/articleEdit', info);

Wir definieren eine Methode „apiArticleEdit“, die über einen Parameter „info“ verfügt. Dabei handelt es sich um das Parameterobjekt, das wir beim Anfordern der Schnittstelle mitführen. Dann rufen wir unsere gekapselte Axios-Methode auf. Der erste Parameter ist unsere Schnittstellenadresse und der zweite Parameter ist der Info-Parameter von apiArticleEdit, also das Parameterobjekt, das bei der Anforderung der Schnittstelle mitgeführt wird. Exportieren Sie abschließend apiArticleEdit über Export.

Dann können wir unsere API-Schnittstelle auf unserer Seite wie folgt aufrufen:

importiere React, {Komponente} von 'react'
 importiere { apiArticleEdit } von './request/api'
exportiere Standardklasse App erweitert Komponente {
  componentDidMount() { 
    // Rufen Sie die API-Schnittstelle auf und geben Sie zwei Parameter an let params = { type: 2, author: '北孤清茶' }
    apiArticleEdit(params).then(res => { 
      //Weitere Vorgänge nach erfolgreichem Datenabruf//.....
      Konsole.log(res)
    })
  }
  rendern() {
    zurückkehren (
      <div>
        
      </div>
    )
  }
}

Für andere API-Schnittstellen erweitern Sie diese einfach weiter in api.js. Freundliche Erinnerung: Schreiben Sie Kommentare für jede Schnittstelle! ! !

Ein Vorteil der API-Schnittstellenverwaltung besteht darin, dass wir die APIs zentralisieren. Wenn wir die Schnittstelle später ändern müssen, können wir die entsprechende Änderung direkt in api.js finden, anstatt jede Seite einzeln aufzurufen, um unsere Schnittstelle zu finden und sie dann zu ändern, was sehr mühsam wäre. Entscheidend ist, was passiert, wenn die Änderungsmenge groß ist. Darüber hinaus besteht die Gefahr, dass wir unseren Geschäftscode versehentlich verschieben und unnötige Probleme verursachen, wenn wir die Schnittstelle direkt in unserem Geschäftscode ändern.

Okay, hier ist endlich der fertige Axios-Kapselungscode.

//Axios in index.js einführen
importiere Axios von „Axios“;
//Führen Sie das QS-Modul ein, um Post-Type-Daten zu serialisieren. Importieren Sie QS von „qs“.
//Antds Nachrichtenaufforderungskomponente, Sie können sie entsprechend Ihrer eigenen UI-Komponente ändern.
importiere {Nachricht} von 'antd'

//Umgebungsvariablen speichern const isPrd = process.env.NODE_ENV == 'production';

//Unterscheiden Sie zwischen der Basis-URL der Entwicklungsumgebung und der Produktionsumgebung
export const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

//Den Axios-Basispfad festlegen const service = axios.create({
  baseURL: Basis-URL
})

// Interceptor anfordern service.interceptors.request.use(config => { 
  // Überprüfen Sie vor dem Senden jeder Anfrage, ob sich ein Token im lokalen Speicher befindet. Sie können hier auch Redux verwenden, um nur zu demonstrieren, wie Sie das Token lokal erhalten.
  // Falls vorhanden, füge das Token dem Header der http-Anfrage hinzu, damit das Backend deinen Login-Status anhand des Tokens ermitteln kann. // Auch wenn das Token lokal vorhanden ist, ist es möglich, dass das Token abgelaufen ist, daher muss der Rückgabestatus im Antwort-Interceptor ermittelt werden const token = window.localStorage.getItem('userToken') || window.sessionStorage.getItem('userToken');
  //Jeder Anfrage ein Token hinzufügen
  config.data = Objekt.assign({}, config.data, {
    Zeichen: Zeichen,
  })
  //Setze den Anforderungsheader config.headers = {
    „Inhaltstyp“: „Anwendung/x-www-form-urlencoded; Zeichensatz=utf-8“
  }
  //Serialisieren Sie die Anforderungsparameter, sonst werden die Post-Anforderungsparameter nicht normal vom Backend empfangen config.data = QS.stringify(config.data)
  Konfiguration zurückgeben
}, Fehler => { 
    Rückgabefehler;
})

// Antwort-Interceptor service.interceptors.response.use(response => {
  //Machen Sie unterschiedliche Dinge basierend auf dem zurückgegebenen Statuscode// Verhandeln Sie unbedingt mit den Backend-Entwicklern einen einheitlichen Fehlerstatuscode, wenn (response.code) {
    Schalter (Antwortcode) {
      Fall 200:
        Antwortdaten zurückgeben;
      Fall 401:
        //Nicht angemeldet bei der Verarbeitungsmethode „break“;
      Fall 403:
        //Methode zur Verarbeitung des Token-Ablaufs break;
      Standard:
        Nachricht.Fehler(Antwort.Daten.Nachricht)
    }
  } anders { 
    Antwort zurückgeben;
  }
})
//Exportieren Sie abschließend den gekapselten Axios-Export-Standarddienst

Zusammenfassen

Dies ist das Ende dieses Artikels über die Kapselung und API-Schnittstellenverwaltung von Axios in React-Projekten. Weitere relevante Inhalte zur Axios-Kapselung und API-Schnittstelle in React finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Kennen Sie das Axios-Modul in React?
  • Axios-Modul in React und wie man es verwendet
  • So verwenden Sie Axios, um Netzwerkanforderungen in React Native zu stellen
  • React Axios - domänenübergreifender Zugriff auf einen oder mehrere Domänennamen
  • React verwendet Axios, um API-Netzwerkanforderungen zu kapseln

<<:  SQL Left Join und Right Join - Prinzip und Beispielanalyse

>>:  Implementierung der Docker-Bereitstellung von Webprojekten

Artikel empfehlen

Benutzerdefinierte Komponente der unteren Navigationsleiste des WeChat-Applets

In diesem Artikelbeispiel wird der spezifische Im...

Tabelle td Bild horizontal und vertikal zentriert Code

HTML Code: Code kopieren Der Code lautet wie folgt...

PostgreSQL-Materialisierte Ansichtsprozessanalyse

Dieser Artikel stellt hauptsächlich die Prozessan...

So fügen Sie einer Tabelle in SQL Felder und Kommentare hinzu

1. Felder hinzufügen: Tabelle Tabellennamen änder...

Installations- und Verwendungsschritte für Docker Compose

Inhaltsverzeichnis 1. Was ist Docker Compose? 2. ...

Beispiele für die Verwendung von „Provide“ und „Inject“ in Vue2.0/3.0

Inhaltsverzeichnis 1. Was ist der Nutzen von Prov...

Lösung für das Problem des MySQL-Threads beim Öffnen von Tabellen

Problembeschreibung Vor kurzem gab es einen MySQL...

Vollständige Schritte zum Bereitstellen von Confluence mit Docker

Confluence ist kostenpflichtig, kann aber für die...

Detaillierte Erklärung zum Erstellen eines Arrays in JavaScript

Inhaltsverzeichnis Erstellen von Arrays in JavaSc...

Detaillierte Erklärung zur Verwendung des Schlüsselworts ESCAPE in MySQL

MySQL-Escape Escape bedeutet die ursprüngliche Se...

So gehen Sie mit Zeitzonenproblemen in Docker um

Hintergrund Als ich in diesen beiden Tagen Docker...

Zusammenfassung einiger Vorschläge zum HTML-Code-Schreibstil

Das Protokoll der Ressourcendatei weglassen Es wi...