Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich einen HTTP-Server nach einer Antwort ordnungsgemäß herunterfahren?

Wie kann ich einen HTTP-Server nach einer Antwort ordnungsgemäß herunterfahren?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 04:19:30498Durchsuche

How to Gracefully Shut Down an HTTP Server After a Response?

HTTP-Server nach Antwort ordnungsgemäß herunterfahren

Problem

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

Analyse

Der Fehler tritt auf, weil der HTTP-Server noch andere Anfragen verarbeitet, während showTokenToUser Der Handler versucht, ihn herunterzufahren.

Lösung

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

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

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