Zum Hauptinhalt springen

Middleware-Arbeit in Golang - Anwendungen und Beispiele

Middleware ist eines der Schlüsselelemente in der Softwareentwicklung in der Programmiersprache Golang. Es ermöglicht Ihnen, HTTP-Anforderungen effizient zu verarbeiten und zu ändern, bevor sie die Anwendung erreichen und nachdem sie vom Server verarbeitet wurden. Als Ergebnis wird middleware zu einem zuverlässigen Werkzeug für die Implementierung verschiedener Funktionen wie Authentifizierung, Autorisierung, Logging, Komprimierung, Caching und vieles mehr.

Die Arbeit von middleware basiert auf der Idee einer Handlerkette. Jedes middleware kann die Anforderung verarbeiten und weiter in der Kette weiterleiten. Es ermöglicht Ihnen, flexible und skalierbare Anwendungen zu erstellen, bei denen jede Verantwortungsebene auf der entsprechenden middleware liegt. Sie können beispielsweise eine Middleware für die Authentifizierung und Autorisierung von Benutzern erstellen, die Zugriffstoken und Berechtigungen überprüft, bevor Sie eine Anforderung an die Anwendung senden.

Um Middleware in ihrer Golang-basierten Anwendung zu verwenden, muss der Entwickler das net/http-Paket importieren und middleware in der Serverhandlerfunktion registrieren. Golang bietet dank klar definierter Schnittstellen und Datenstrukturen umfangreiche Möglichkeiten zum Erstellen von Middleware. Sie können beispielsweise eine Middleware mit einer Handlerfunktion oder einer Struktur erstellen, die die http-Schnittstelle implementiert.Handler.

Wie funktioniert middleware in Golang

Middleware (Middleware) in Golang ist eine Funktion, die vor und nach der Bearbeitung von Anforderungen ausgeführt wird. Sie ermöglichen es Ihnen, die Abfrage zu ändern, zusätzliche Funktionalität hinzuzufügen und Fehler zu behandeln.

Um middleware in Golang zu verwenden, müssen Sie eine Funktion erstellen, die http-Objekte als Argumente akzeptiert.ResponseWriter und *http.Request und gibt eine Handlerfunktion (handler) oder einen Fehler zurück.

Die Middlewar in Golang kann verschiedene Aktionen ausführen, zum Beispiel:

  • Abfragen und Antworten protokollieren;
  • Authentifizierung und Autorisierung;
  • Ändern von Anfragen und Antworten;
  • Fehlerbehandlung und -protokollierung;
  • Beschränken Sie den Zugriff auf bestimmte Ressourcen.

Middleware wird nacheinander in der Reihenfolge ausgeführt, in der sie angegeben wurden. Jede Middlewar-Funktion kann entscheiden, ob die Steuerung an die nächste Funktion übergeben oder die Verarbeitung stoppen soll.

Beispiel für die Verwendung von middleware:

func main() // Обработчик конечной точкиfunc getUsers(w http.ResponseWriter, r *http.Request) 

Im obigen Beispiel werden middleware Logger und Authenticate vor jeder Anforderung an den Endpunkt "/api/users" aufgerufen. Middleware Logger protokolliert Anfragen und Antworten und Authenticate überprüft die Authentifizierung.

Middleware ermöglicht es Ihnen, allgemeine Logik und Funktionalität aus Handlern zu entfernen, wodurch der Code modularer, lesbarer und einfacher zu warten ist.

Verwenden von Middleware in Golang

Middleware in Golang spielt eine wichtige Rolle bei der Entwicklung von Webanwendungen. Es ermöglicht Ihnen, die Abfrageverarbeitungslogik in separate Schritte aufzuteilen, was die Unterstützung und Erweiterung der Anwendung erleichtert.

In Golang ist Middleware eine Funktion, die einen HTTP-Handler annimmt und einen neuen Handler zurückgibt. Middleware kann verschiedene Aufgaben ausführen, z. B. Benutzerauthentifizierung, Berechtigungsüberprüfung, Logging und vieles mehr.

Ein Beispiel für die Verwendung von Middleware in Golang lautet wie folgt:

func Logger(next http.HandlerFunc) http.HandlerFunc >func main() 

In diesem Beispiel ist die Logger-Funktion middleware. Sie nimmt einen HTTP-Handler an, fügt die Protokollierung hinzu und gibt einen neuen Handler zurück. Daher wird jede Anfrage diese middleware durchlaufen und Informationen über ihre Verarbeitung werden in das Protokoll geschrieben.

Middleware kann verkettet werden, um nacheinander ausgeführt zu werden. In diesem Fall kann jedes middleware die Anfrage oder Antwort ändern, bevor es an das nächste middleware übergeben wird. Auf diese Weise können Sie eine flexible und skalierbare Anwendungsarchitektur erstellen.

Die Verwendung von Middleware in Golang ermöglicht es Ihnen, den Anwendungscode modularer, verständlicher und leicht erweiterbar zu machen. Dadurch kann sich der Entwickler auf die Implementierung der Geschäftslogik konzentrieren, ohne sich um die Details der Abfrageverarbeitung zu kümmern und die Sicherheit und Benutzerfreundlichkeit der Anwendung zu gewährleisten.

Beispiele für die Arbeit mit middleware in Golang

Beispiel 1:

Betrachten Sie ein Beispiel für die Verwendung von Middleware zum Autorisieren von Webanforderungen. Angenommen, wir haben eine Funktion, die überprüft, ob der Benutzer autorisiert ist:

func isAuthenticated(next http.HandlerFunc) http.HandlerFunc return func(w http.ResponseWriter, r *http.Request) if userLoggedIn(r) next(w, r)
> else http.Redirect(w, r, "/login", http.StatusUnauthorized)
>
>
>

Hier nimmt die IsAuthenticated-Funktion als Argument die next-Handlerfunktion an, die aufgerufen wird, wenn der Benutzer autorisiert ist. Andernfalls wird sie zur Anmeldeseite der Website weitergeleitet.

Um diese middleware in einer Anwendung zu verwenden, müssen Sie eine Route deklarieren und die Handlerfunktion IsAuthenticated als Argument übergeben:

http.HandleFunc("/secret", isAuthenticated(func(w http.ResponseWriter, r *http.Request) < fmt.Fprintln(w, "Секретная информация") >))

Beispiel 2:

Ein weiteres Beispiel für die Verwendung von Middleware ist das Protokollieren von Abfragen. Erstellen Sie eine logRequest-Funktion, die alle eingehenden Anfragen protokolliert:

func logRequest(next http.HandlerFunc) http.HandlerFunc return func(w http.ResponseWriter, r *http.Request) log.Println("Anfrage erhalten:", r.Method, r.URL.Path)
next(w, r)
>
>

Ähnlich wie im vorherigen Beispiel übergeben wir die Handlerfunktion next , die nach dem Loggen der Anfrage aufgerufen wird.

Um diese Middleware in der Anwendung zu verwenden, müssen Sie die logRequest-Funktion auf die gewünschten Routen anwenden:

http.HandleFunc("/", logRequest(func(w http.ResponseWriter, r *http.Request) < fmt.Fprintln(w, "Привет, мир!") >))

Wenn Sie auf eine beliebige Route zugreifen, wird eine Nachricht in ein Protokoll mit Informationen über die Methode und den Pfad der Abfrage geschrieben.