Apabila menggunakan pelayan HTTP tempatan untuk menangkap token akses OAuth untuk penyepaduan API Instagram, pelayan perlu ditutup selepas token dipaparkan kepada pengguna. Walau bagaimanapun, percubaan untuk menamatkan pelayan secara manual menggunakan srv.Shutdown() mengakibatkan ralat:
Httpserver: ListenAndServe() error: http: Server closed http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
Ralat berlaku kerana pelayan HTTP masih mengendalikan permintaan lain semasa showTokenToUser pengendali sedang cuba untuk menutupnya.
Untuk menutup pelayan HTTP dengan anggun selepas melengkapkan permintaan panggil balik:
1. Gunakan Context.WithCancel()
Gunakan context.WithCancel() untuk mencipta konteks yang boleh dibatalkan secara manual. Hantar konteks ini kepada pelayan HTTP apabila memulakannya.
2. Matikan Pelayan dengan Anggun
Dalam pengendali panggil balik showTokenToUser, panggil srv.Shutdown(ctx) untuk mematikan pelayan dengan anggun. ctx ialah konteks yang dibatalkan yang dihantar kepada pelayan.
<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>
Penyelesaian ini memastikan pelayan HTTP ditutup dengan anggun selepas permintaan panggil balik selesai, tanpa menyebabkan sebarang ralat atau gangguan sambungan berterusan.
Atas ialah kandungan terperinci Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Tindak Balas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!