Heim > Backend-Entwicklung > Golang > Wie kann ich HTTP-Anfragen in Go ordnungsgemäß verarbeiten und beenden?

Wie kann ich HTTP-Anfragen in Go ordnungsgemäß verarbeiten und beenden?

Mary-Kate Olsen
Freigeben: 2024-12-01 14:28:10
Original
107 Leute haben es durchsucht

How to Gracefully Handle and Terminate HTTP Requests in Go?

Beenden oder Abbrechen einer HTTP-Anfrage

Um Fehler während der API-Verarbeitung zu behandeln, ist es wichtig, die Anfrage zu beenden oder abzubrechen. Während Optionen wie log.fatal und os.Exit möglicherweise den gesamten Dienst beenden, behindern sie die Zustellung von Fehlermeldungen. In diesem Artikel werden alternative Ansätze mit Panic, Defer, Recovery und Return untersucht.

Fehlerbehandlung mit Return

Die einfachste Methode ist die Rückkehr von der ServeHTTP()-Funktion:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // Check parameters
    if !ok {
        str := `{"Result":"","Error":"Invalid Parameters"}`
        fmt.Fprint(w, str)
        return // Terminates the request
    }

    // Normal API handling
})
Nach dem Login kopieren

Dieser Ansatz funktioniert gut für die Haupt-HTTP-Handlerfunktion, aber innerhalb verschachtelter Funktionen existiert nur die Funktion, nicht die Anrufer.

HTTP-Fehlercodes und benutzerdefinierte Antworten

Anstelle des standardmäßigen Antwortcodes 200 OK sollten Sie erwägen, einen geeigneten HTTP-Fehlercode zurückzugeben. http.Error() ermöglicht benutzerdefinierte Fehlermeldungen:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if !ok {
        http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest)
        return
    }

    // Normal API handling
})
Nach dem Login kopieren

Für eine detailliertere Kontrolle können Sie einen benutzerdefinierten Inhaltstyp und Antworttext festlegen:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if !ok {
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusBadRequest)
        str := `{"Result":"","Error":"Invalid Input Parameters"}`
        fmt.Fprint(w, str)
        return
    }

    // Normal API handling
})
Nach dem Login kopieren

Fehlerweitergabe mit Verzögerung und Wiederherstellung

Wenn die Fehlererkennung außerhalb von ServeHTTP() erfolgt, können Verzögerung und Wiederherstellung zur Weitergabe verwendet werden den Fehlerstatus an den Haupthandler:

type params struct {
    // Parameter fields
}

func decodeParams(r *http.Request) (*params, error) {
    p := new(params)
    defer func() {
        if r := recover(); r != nil {
            log.Println(r)
            return
        }
    }()
    // Parameter decoding
    if !ok {
        panic(errors.New("Invalid Parameters"))
    }

    return p, nil
}

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    p, err := decodeParams(r)
    if err != nil {
        http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest)
        return
    }

    // Normal API handling
})
Nach dem Login kopieren

Bei diesem Ansatz registriert defer eine Bereinigungsfunktion, die sicherstellt, dass die Funktion „recover()“ unabhängig von der Rückkehr oder Panik der Funktion ausgeführt wird. Wenn decodeParams einen ungültigen Parameter erkennt, gerät es in Panik, gibt effektiv einen Fehler von ServeHTTP() zurück und ermöglicht die Rückgabe der Fehlermeldung.

Das obige ist der detaillierte Inhalt vonWie kann ich HTTP-Anfragen in Go ordnungsgemäß verarbeiten und beenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage