Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich einen HTTP-Server manuell herunterfahren, nachdem das Zugriffstoken in Go angezeigt wurde?

Wie kann ich einen HTTP-Server manuell herunterfahren, nachdem das Zugriffstoken in Go angezeigt wurde?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 03:07:28334Durchsuche

How can I manually shut down an HTTP server after displaying the access token in Go?

HTTP-Server nach Anzeige des Zugriffstokens manuell herunterfahren

Um den beim Herunterfahren des HTTP-Servers aufgetretenen Fehler zu beheben, können Sie den Kontext nutzen .WithCancel-Funktion. Bei diesem Ansatz wird ein Kontext erstellt, der manuell abgebrochen werden kann, sodass Sie den Server ordnungsgemäß schließen können.

<code class="go">package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "net/http"
    "time"
)

var client_id = "my_client_id"
var client_secret = "my_client_secret"
var redirect_url = "http://localhost:8000/instagram/callback"

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    srv := startHttpServer(ctx)

    openbrowser(fmt.Sprintf("https://api.instagram.com/oauth/authorize/?client_id=%v&amp;redirect_uri=%v&amp;response_type=code&quot;, client_id, redirect_url))

    // Listen for context cancellation signals
    go func() {
        <-ctx.Done()

        // Gracefully shut down the server
        if err := srv.Shutdown(context.Background()); err != nil {
            panic(err) // failure/timeout shutting down the server gracefully
        }
    }()

    time.Sleep(20 * time.Second)
    cancel()
}

func showTokenToUser(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, fmt.Sprintf("Your access token is: %v", r.URL.Query().Get("code")))
}

func startHttpServer(ctx context.Context) *http.Server {
    srv := &http.Server{Addr: ":8000"}

    http.HandleFunc("/instagram/callback", showTokenToUser)
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        io.WriteString(w, "Hello world!")
    })

    go func() {
        if err := srv.ListenAndServe(); err != http.ErrServerClosed {
            // cannot panic, because this probably is an intentional close
            log.Fatalf("Httpserver: ListenAndServe() error: %s", err)
        }
    }()

    // Return the server reference for use in shutting down
    return srv
}

func openbrowser(url string) {
    var err error

    switch runtime.GOOS {
    case "linux":
        err = exec.Command("xdg-open", url).Start()
    case "windows":
        err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
    case "darwin":
        err = exec.Command("open", url).Start()
    default:
        err = fmt.Errorf("unsupported platform")
    }
    if err != nil {
        log.Fatal(err)
    }
}</code>

Diese Lösung verwendet eine separate Goroutine, um den Kontextabbruch und das ordnungsgemäße Herunterfahren des Servers zu verwalten. Wenn der Benutzer auf die Route /quit zugreift, wird der Kontext abgebrochen, was den Prozess zum Herunterfahren des Servers auslöst.

Das obige ist der detaillierte Inhalt vonWie kann ich einen HTTP-Server manuell herunterfahren, nachdem das Zugriffstoken in Go angezeigt wurde?. 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