ホームページ  >  記事  >  バックエンド開発  >  応答後に HTTP サーバーを正常にシャットダウンするにはどうすればよいですか?

応答後に HTTP サーバーを正常にシャットダウンするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 04:19:30579ブラウズ

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

応答後に HTTP サーバーを正常にシャットダウンする

問題

ローカル HTTP サーバーを使用して Instagram API 統合の OAuth アクセス トークンをキャプチャする場合、トークンがユーザーに表示された後、サーバーをシャットダウンする必要があります。ただし、srv.Shutdown() を使用してサーバーを手動で終了しようとすると、次のエラーが発生します。

Httpserver: ListenAndServe() error: http: Server closed
http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference

分析

このエラーは、showTokenToUser の実行中に HTTP サーバーがまだ他のリクエストを処理しているために発生します。ハンドラーがシャットダウンしようとしています。

解決策

コールバック要求の完了後に HTTP サーバーを正常にシャットダウンするには:

1. Context.WithCancel() を使用します

context.WithCancel() を使用して、手動でキャンセルできるコンテキストを作成します。 HTTP サーバーの起動時に、このコンテキストを HTTP サーバーに渡します。

2.サーバーを正常にシャットダウンします

コールバック ハンドラー showTokenToUser で、srv.Shutdown(ctx) を呼び出してサーバーを正常にシャットダウンします。 ctx は、サーバーに渡されるキャンセルされたコンテキストです。

コード

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

このソリューションにより、コールバック リクエストの完了後に、エラーや中断が発生することなく、HTTP サーバーが正常にシャットダウンされます。継続的な接続。

以上が応答後に HTTP サーバーを正常にシャットダウンするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。