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 })
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 })
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 })
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 })
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!