Bei der Verwendung eines lokalen HTTP-Servers zum Erfassen von OAuth-Zugriffstokens für eine Instagram-API-Integration wird die Der Server muss heruntergefahren werden, nachdem das Token dem Benutzer angezeigt wurde. Der Versuch, den Server mit srv.Shutdown() manuell zu beenden, führt jedoch zu einem Fehler:
Httpserver: ListenAndServe() error: http: Server closed http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
Der Fehler tritt auf, weil der HTTP-Server noch andere Anfragen verarbeitet, während showTokenToUser Der Handler versucht, ihn herunterzufahren.
Um den HTTP-Server nach Abschluss der Rückrufanforderung ordnungsgemäß herunterzufahren:
1. Verwenden Sie Context.WithCancel()
Verwenden Sie context.WithCancel(), um einen Kontext zu erstellen, der manuell abgebrochen werden kann. Übergeben Sie diesen Kontext beim Starten an den HTTP-Server.
2. Fahren Sie den Server ordnungsgemäß herunter
Rufen Sie im Callback-Handler showTokenToUser srv.Shutdown(ctx) auf, um den Server ordnungsgemäß herunterzufahren. ctx ist der abgebrochene Kontext, der an den Server übergeben wird.
<code class="go">package main import ( "context" "io" "log" "net/http" ) func main() { ctx, cancel := context.WithCancel(context.Background()) http.HandleFunc("/instagram/callback", func(w http.ResponseWriter, r *http.Request) { showTokenToUser(w, r, ctx) }) srv := &http.Server{Addr: ":8000"} go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Printf("httpserver: ListenAndServe() error: %s", err) } }() <-ctx.Done() // Gracefully shut down the server if err := srv.Shutdown(context.Background()); err != nil && err != context.Canceled { log.Println(err) } } func showTokenToUser(w http.ResponseWriter, r *http.Request, ctx context.Context) { io.WriteString(w, fmt.Sprintf("Your access token is: %v", r.URL.Query().Get("code"))) cancel() }</code>
Diese Lösung stellt sicher, dass der HTTP-Server nach Abschluss der Rückrufanforderung ordnungsgemäß heruntergefahren wird, ohne dass es zu Fehlern oder Unterbrechungen kommt laufende Verbindungen.
Das obige ist der detaillierte Inhalt vonWie kann ich einen HTTP-Server nach einer Antwort ordnungsgemäß herunterfahren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!