>  기사  >  백엔드 개발  >  응답 후 HTTP 서버를 정상적으로 종료하는 방법은 무엇입니까?

응답 후 HTTP 서버를 정상적으로 종료하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 04:19:30498검색

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

Analytic

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.