ホームページ  >  記事  >  バックエンド開発  >  Go でアクセス トークンを表示した後、HTTP サーバーを手動でシャットダウンするにはどうすればよいですか?

Go でアクセス トークンを表示した後、HTTP サーバーを手動でシャットダウンするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 03:07:28334ブラウズ

How can I manually shut down an HTTP server after displaying the access token in Go?

アクセス トークンの表示後に HTTP サーバーを手動でシャットダウンする

HTTP サーバーのシャットダウン時に発生したエラーを解決するには、コンテキストを利用できます。 .キャンセル機能付き。このアプローチでは、手動でキャンセルできるコンテキストを作成して、サーバーを正常に閉じることができます。

<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&amp;redirect_uri=%v&amp;response_type=code&quot;, 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>

このソリューションでは、別の goroutine を利用して、コンテキストのキャンセルとサーバーの正常なシャットダウンを処理します。ユーザーが /quit ルートにアクセスすると、コンテキストがキャンセルされ、サーバーのシャットダウン プロセスがトリガーされます。

以上がGo でアクセス トークンを表示した後、HTTP サーバーを手動でシャットダウンするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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