Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Tindak Balas?

Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Tindak Balas?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 04:19:30498semak imbas

How to Gracefully Shut Down an HTTP Server After a Response?

Mematikan Pelayan HTTP Selepas Respons dengan Anggun

Masalah

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

Analisis

Ralat berlaku kerana pelayan HTTP masih mengendalikan permintaan lain semasa showTokenToUser pengendali sedang cuba untuk menutupnya.

Penyelesaian

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.

Kod

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

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