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&redirect_uri=%v&response_type=code", 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!