ローカル 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 サイトの他の関連記事を参照してください。