Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh menutup pelayan HTTP secara manual selepas memaparkan token akses dalam Go?

Bagaimanakah saya boleh menutup pelayan HTTP secara manual selepas memaparkan token akses dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-01 03:07:28334semak imbas

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

Mematikan Pelayan HTTP Secara Manual Selepas Memaparkan Token Akses

Untuk menyelesaikan ralat yang dihadapi semasa menutup pelayan HTTP, anda boleh menggunakan konteks .Dengan fungsi Batal. Pendekatan ini melibatkan penciptaan konteks yang boleh dibatalkan secara manual, membolehkan anda menutup pelayan dengan anggun.

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

Penyelesaian ini menggunakan goroutine berasingan untuk mengendalikan pembatalan konteks dan penutupan pelayan yang anggun. Apabila pengguna mengakses laluan /quit, konteks dibatalkan, yang mencetuskan proses penutupan pelayan.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menutup pelayan HTTP secara manual selepas memaparkan token akses dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn