Heim >Backend-Entwicklung >Golang >Rechner-Backend-API in Go

Rechner-Backend-API in Go

Barbara Streisand
Barbara StreisandOriginal
2024-12-05 08:14:10358Durchsuche

Wieder zurück mit einem weiteren Miniprojekt, dieses Mal mit einem in Go! geschriebenen Taschenrechner-Backend-API-Tool!

Ich habe kürzlich ein Projekt zum Erstellen einer HTTP-JSON-API für einen zustandslosen Rechner abgeschlossen, und ich kann Ihnen sagen: Es hat viel mehr Spaß gemacht (und war etwas anspruchsvoller), als ich erwartet hatte. Oberflächlich betrachtet mag es einfach klingen: „Hey, es ist nur ein Taschenrechner, oder?“ Aber wenn man erst einmal eintaucht, beginnt man, alle wichtigen Details aufzudecken, die eine API wirklich produktionsbereit machen.

Lassen Sie mich also den Prozess, die gewonnenen Erkenntnisse und die Optimierungen, die ich vornehmen würde, wenn ich es noch einmal tun müsste, mit Ihnen teilen.

~ Quellcode: Hier zu finden

Eine zustandslose Rechner-API

Die Mission war unkompliziert: Erstellen Sie eine API für einen Taschenrechner, der keine Daten speichert – keine Datenbanken, kein In-Memory-Caching. Jede Berechnung erfolgt isoliert. Staatenlos. Sauber. Einfach. Die API folgt einer OpenAPI-Spezifikation, die alle Endpunkte und erwarteten Verhaltensweisen festlegt.

Was kommt als nächstes?

Eingabevalidierung

Eine der ersten Lektionen, die ich gelernt habe, war die Bedeutung der Eingabevalidierung. Man kann Benutzern nicht vertrauen, selbst wenn es um etwas so Grundlegendes wie Mathematik geht. Zum Beispiel:

Was passiert, wenn jemand eine Nichtnummer einsendet? Boom.
Wie wäre es mit einer Division durch Null? Doppelter Boom.

Um dies zu bewältigen, habe ich dafür gesorgt, dass jede Eingabe bereinigt und validiert wurde, bevor die API überhaupt daran dachte, sie zu verarbeiten. Wenn etwas nicht stimmte, erhielt der Benutzer eine hilfreiche, freundliche Fehlermeldung wie:

{
  "error": "Division by zero is not allowed. Please provide a valid denominator."
}

Niemand mag kryptische „500 Serverfehler“-Meldungen.

Protokollierung zum Debuggen

Sie kennen das Sprichwort: „Protokolle sind Ihr bester Freund“? Es ist wahr. Ich habe die strukturierte Protokollierung mithilfe eines Pakets von Go golang.org/x/exp/slog implementiert und dadurch viel Zeit gespart. Jede Anfrage wurde mit Details wie:

protokolliert
  • Der Anforderungspfad
  • Die IP-Adresse des Benutzers
  • Der Statuscode
  • Alle aufgetretenen Fehler

Hier ist ein Ausschnitt davon, wie ich es für Textprotokolle eingerichtet habe:

logger := slog.New(slog.NewTextHandler(os.Stdout, nil))

Oder für JSON-Protokolle (die sich hervorragend für die Integration in Überwachungstools eignen):

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

Die Verfügbarkeit dieser Protokolle machte das Debuggen zum Kinderspiel, wenn etwas nicht wie erwartet funktionierte.

CORS: Ein unerwarteter Held

Calculator Backend-API In Go

Ich hatte ursprünglich nicht geplant, diese API in einer browserbasierten App zu verwenden, aber als sich das Projekt weiterentwickelte, wurde klar, dass CORS (Cross-Origin Resource Sharing) notwendig war.

Mit dem Paket github.com/rs/cors habe ich schnell die erforderlichen Header hinzugefügt, um browserbasierten Clients die Interaktion mit der API zu ermöglichen.

{
  "error": "Division by zero is not allowed. Please provide a valid denominator."
}

Meine Hauptpakete

1) net/http: Gos Standardbibliothek zum Einrichten des HTTP-Servers und zum Weiterleiten von Anforderungen.
2) Encoding/JSON: Zur Verarbeitung der JSON-Codierung/Decodierung für Anfragen und Antworten.
3) golang.org/x/exp/slog: Zum Protokollieren jeder Anfrage im Text- oder JSON-Format.
4) github.com/rs/cors: Um ursprungsübergreifende Anfragen für Webintegrationen zu bearbeiten.

Wie sieht es mit der Berechnungslogik aus?

Nun, ich habe einige Handler für diese Berechnungen erstellt. Sie sind von Natur aus ziemlich einfach und konzentrieren sich hauptsächlich auf die Kernfunktionen von Berechnungen (Addition, Subtraktion, Division und Multiplikation).

logger := slog.New(slog.NewTextHandler(os.Stdout, nil))

Abgesehen davon war die Bearbeitung meiner HTTP-Anfragen mit dem berühmten Paket net/http unkompliziert und es gibt viele Beispiele dafür, dies auf unterschiedliche Weise zu tun. Mein Fall war sehr einfach und ich musste nur etwas HTTP bereitstellen und den Antwortschreiber und die Anfrage verwalten.

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

Hier sind einige Anwendungsbeispiele:

c := cors.New(cors.Options{
        AllowedOrigins:   []string{"*"},
        AllowedMethods:   []string{"GET", "POST", "OPTIONS"},
        AllowedHeaders:   []string{"Content-Type"},
        AllowCredentials: true,
    })

Anfragen:

//handlers.go

func AddHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 { return a + b })
    }
}

func SubtractHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 { return a - b })
    }
}

func MultiplyHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 { return a * b })
    }
}

func DivideHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 {
            if b == 0 {
                panic("division by zero")
            }
            return a / b
        })
    }
}

Abschluss

Ja! Das ist so ziemlich alles! Es war ein schnelles und unterhaltsames Miniprojekt, das mir Spaß gemacht hat! Probieren Sie es einfach aus und verbessern und erweitern Sie es, wie auch immer Sie möchten.

Bis zum nächsten Mal, Prost! ? ?

Das obige ist der detaillierte Inhalt vonRechner-Backend-API in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn