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

Linda Hamilton
Freigeben: 2024-10-31 04:19:30
Original
576 Leute haben es durchsucht

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
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

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