로컬 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 서버에 전달합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!