第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 http.NewRequestWithContext() 創(chuàng)建的請(qǐng)求在傳遞給中間件時(shí)會(huì)丟失

使用 http.NewRequestWithContext() 創(chuàng)建的請(qǐng)求在傳遞給中間件時(shí)會(huì)丟失

Go
冉冉說 2022-10-10 19:12:22
在下面的程序中,我有兩個(gè)路由器。一個(gè)在公共接入點(diǎn)工作localhost:3000并充當(dāng)公共接入點(diǎn)。它還可以將帶有數(shù)據(jù)的請(qǐng)求發(fā)送到另一個(gè)localhost:8000正在處理數(shù)據(jù)的本地地址。第二個(gè)路由器正在localhost:8000處理第一個(gè)路由器的處理請(qǐng)求。問題http.NewRequestWithContext()第一個(gè)路由器向第二個(gè)使用函數(shù)發(fā)送帶有上下文的請(qǐng)求。該值被添加到上下文中,并且上下文被添加到請(qǐng)求中。當(dāng)請(qǐng)求到達(dá)第二個(gè)路由器時(shí),它沒有先前添加的值。諸如錯(cuò)誤處理之類的某些內(nèi)容并未被編寫為不要在此處發(fā)布代碼墻。package mainimport (    "bytes"    "context"    "net/http"    "github.com/go-chi/chi"    "github.com/go-chi/chi/middleware")func main() {    go func() {        err := http.ListenAndServe(            "localhost:3000",            GetDataAndSolve(),        )        if err != nil {            panic(err)        }    }()    go func() {        err := http.ListenAndServe( // in GetDataAndSolve() we send requests            "localhost:8000", // with data for processing            InternalService(),        )        if err != nil {            panic(err)        }    }()    // interrupt := make(chan os.Signal, 1)     // signal.Notify(interrupt, syscall.SIGTERM, syscall.SIGINT)    // <-interrupt // just a cool way to close the program, uncomment if you need it}func GetDataAndSolve() http.Handler {    r := chi.NewRouter()    r.Use(middleware.Logger)    r.Get("/tasks/str", func(rw http.ResponseWriter, r *http.Request) {        // receiving data for processing...        taskCtx := context.WithValue(r.Context(), "str", "strVar") // the value is being        postReq, err := http.NewRequestWithContext(                // stored to context            taskCtx, // context is being given to request            "POST",            "http://localhost:8000/tasks/solution",            bytes.NewBuffer([]byte("something")),        )        postReq.Header.Set("Content-Type", "application/json") // specifying for endpoint        if err != nil {                                        // what we are sending            return        }}
查看完整描述

1 回答

?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊

您對(duì)上下文的理解不正確。

上下文(在某種程度上簡(jiǎn)化并參考NewRequestWithContextAPI)只是一個(gè)內(nèi)存中的對(duì)象,您可以使用它來控制請(qǐng)求的生命周期(處理/觸發(fā)取消)。

但是,您的代碼正在進(jìn)行 HTTP 調(diào)用,該調(diào)用使用 HTTP 協(xié)議通過線路(編組)。該協(xié)議不理解 golang 的上下文或其值。在您的場(chǎng)景中,兩者/tasks/str/tasks/solution在同一臺(tái)服務(wù)器上運(yùn)行。如果它們位于不同的服務(wù)器上怎么辦,可能還有不同的語言和應(yīng)用程序服務(wù)器,所以上下文不能被發(fā)送。

由于 API 在同一臺(tái)服務(wù)器中,也許您可以避免進(jìn)行完整的 HTTP 調(diào)用,而直接調(diào)用 API/方法。它也可能會(huì)變得更快。

如果您仍想從上下文發(fā)送附加值,那么您將不得不利用其他屬性(如 HTTP 標(biāo)頭、參數(shù)、正文)來發(fā)送所需的信息。這可以提供有關(guān)如何通過 HTTP 從上下文序列化數(shù)據(jù)的更多信息。


查看完整回答
反對(duì) 回復(fù) 2022-10-10
  • 1 回答
  • 0 關(guān)注
  • 293 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)