액세스 토큰 표시 후 HTTP 서버 수동 종료
HTTP 서버 종료 시 발생하는 오류를 해결하려면 컨텍스트를 활용할 수 있습니다. .WithCancel 기능. 이 접근 방식에는 수동으로 취소할 수 있는 컨텍스트를 생성하여 서버를 정상적으로 닫을 수 있도록 하는 작업이 포함됩니다.
<code class="go">package main import ( "context" "fmt" "io" "log" "net/http" "time" ) var client_id = "my_client_id" var client_secret = "my_client_secret" var redirect_url = "http://localhost:8000/instagram/callback" func main() { ctx, cancel := context.WithCancel(context.Background()) srv := startHttpServer(ctx) openbrowser(fmt.Sprintf("https://api.instagram.com/oauth/authorize/?client_id=%v&redirect_uri=%v&response_type=code", client_id, redirect_url)) // Listen for context cancellation signals go func() { <-ctx.Done() // Gracefully shut down the server if err := srv.Shutdown(context.Background()); err != nil { panic(err) // failure/timeout shutting down the server gracefully } }() time.Sleep(20 * time.Second) cancel() } func showTokenToUser(w http.ResponseWriter, r *http.Request) { io.WriteString(w, fmt.Sprintf("Your access token is: %v", r.URL.Query().Get("code"))) } func startHttpServer(ctx context.Context) *http.Server { srv := &http.Server{Addr: ":8000"} http.HandleFunc("/instagram/callback", showTokenToUser) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello world!") }) go func() { if err := srv.ListenAndServe(); err != http.ErrServerClosed { // cannot panic, because this probably is an intentional close log.Fatalf("Httpserver: ListenAndServe() error: %s", err) } }() // Return the server reference for use in shutting down return srv } func openbrowser(url string) { var err error switch runtime.GOOS { case "linux": err = exec.Command("xdg-open", url).Start() case "windows": err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() case "darwin": err = exec.Command("open", url).Start() default: err = fmt.Errorf("unsupported platform") } if err != nil { log.Fatal(err) } }</code>
이 솔루션은 별도의 고루틴을 활용하여 컨텍스트 취소 및 서버의 정상적인 종료를 처리합니다. 사용자가 /quit 경로에 액세스하면 컨텍스트가 취소되어 서버 종료 프로세스가 시작됩니다.
위 내용은 Go에서 액세스 토큰을 표시한 후 HTTP 서버를 수동으로 종료하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!