亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

啟動Go HTTP服務器,做一些事情,然后在任務完成后將其關閉

啟動Go HTTP服務器,做一些事情,然后在任務完成后將其關閉

Go
墨色風雨 2022-08-09 20:32:25
我正在從 CLI 應用程序設置 OAuth2 流,我正在處理。我需要為提供商創建一個臨時HTTP服務器以發送回調,例如localhost:8080/callback一旦提供商發送了我需要的詳細信息,我希望能夠關閉HTTP服務器,只是為了保持一切干凈。我想我正在尋找的是例程和等待組,但我對這個領域仍然很陌生。這就是我到目前為止所擁有的。我已經編輯了將用戶發送到提供程序的部分,因為我的主要問題只是如何在捕獲變量后關閉HTTP服務器。token服務器啟動將用戶定向到提供程序站點上的授權 URL用戶批準請求提供程序將用戶定向回localhost:8080/callbackURL僅包含客戶端參數,因此我必須使用服務器HTML來捕獲值并將其發送回服務器服務器接收令牌,然后可以關閉package mainimport (    "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)        }    }()}
查看完整描述

1 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

用:


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.


查看完整回答
反對 回復 2022-08-09
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號