gpt4 book ai didi

go - 启动Go HTTP服务器,执行某些操作,然后在完成任务后将其关闭

转载 作者:行者123 更新时间:2023-12-03 10:09:06 25 4
gpt4 key购买 nike

我正在通过CLI应用程序设置OAuth2流。我需要为提供商创建一个临时HTTP服务器,以将回调发送至localhost:8080/callback提供程序发送完我需要的详细信息后,我希望能够关闭HTTP服务器,只是保持一切干净。我认为我正在寻找的是例程和 WaitGroup ,但是对于这个领域我还是很陌生。
这是我到目前为止所拥有的。我修改了将用户发送到提供程序的部分,因为我的主要问题只是捕获了token变量后如何关闭HTTP服务器。

  • 服务器启动
  • 将用户定向到提供程序站点
  • 上的授权URL
  • 用户批准请求
  • 提供程序将用户引导回localhost:8080/callback
  • URL仅包含客户端参数,因此我必须使用HTML服务器才能使用JS捕获值并将其发送回服务器
  • 服务器接收 token ,然后可以关闭

  • package main

    import (
    "fmt"
    "log"
    "net/http"
    "sync"
    )

    func main() {
    // Start local HTTP serevr to listen for response
    serverDone := &sync.WaitGroup{}
    serverDone.Add(1)
    Start(serverDone)

    // ... Process to start OAuth2 flow
    // User is directed to provider website
    // User approves
    // Provider direct user back to localhost/callback

    serverDone.Wait()
    }

    func Start(wg *sync.WaitGroup) {

    srv := &http.Server{Addr: ":8080"}
    http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) {
    token := r.URL.Query().Get("token")
    if token != "" {
    fmt.Println("Found Token:", token)
    // Shut down server here
    } else {
    // Server HTML page to fetch token and return to server at /callback
    }
    })

    go func() {
    // let main know we are done cleaning up
    defer wg.Done()

    // ErrServerClosed on graceful close
    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
    log.Fatalf("ListenAndServe(): %v", err)
    }
    }()
    }

    最佳答案

    使用:

    var ctxShutdown, cancel = context.WithCancel(context.Background())
    然后:
    cancel() // to say sorry, above.
    // graceful-shutdown
    err := srv.Shutdown(context.Background())
    试试这个:
    package main

    import (
    "context"
    "fmt"
    "log"
    "net/http"
    "sync"
    )

    func main() {
    serverDone := &sync.WaitGroup{}
    serverDone.Add(1)
    Start(serverDone)
    serverDone.Wait()
    fmt.Println("Done that.")
    }

    var ctxShutdown, cancel = context.WithCancel(context.Background())

    func Start(wg *sync.WaitGroup) {
    srv := &http.Server{Addr: ":8080"}
    http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) {
    select {
    case <-ctxShutdown.Done():
    fmt.Println("Sorry: Shuting down ...")
    return
    default:
    }
    token := r.URL.Query().Get("token")
    if token != "" {
    fmt.Println("Found Token:", token)
    fmt.Println("Shuting down ...")
    // Shut down server here
    cancel() // to say sorry, above.
    // graceful-shutdown
    err := srv.Shutdown(context.Background())
    if err != nil {
    log.Println("server.Shutdown:", err)
    }

    } else {
    fmt.Fprintln(w, "Hi") // Server HTML page to fetch token and return to server at /callback
    }
    })

    go func() {
    defer wg.Done()
    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
    log.Fatalf("ListenAndServe(): %v", err)
    }
    fmt.Println("Bye.")
    }()
    }

    运行并打开 http://127.0.0.1:8080/callback?token=2
    输出:
    Found Token: 2
    Shuting down ...
    Bye.
    Done that.

    关于go - 启动Go HTTP服务器,执行某些操作,然后在完成任务后将其关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66289413/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com