Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Tindak Balas?

Linda Hamilton
Lepaskan: 2024-10-31 04:19:30
asal
586 orang telah melayarinya

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
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan