對于傳入的 HTTP 請求,我必須使用202 Accepted狀態碼進行響應,同時繼續在后臺處理有效負載。例如,這就是我目前正在做的事情:package mainimport ( "fmt" "log" "net/http" "time" "github.com/nbari/violetear")func sleep() { time.Sleep(3 * time.Second) fmt.Println("done...")}func index(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusAccepted) go sleep()}func main() { router := violetear.New() router.HandleFunc("*", index) http.Handle("/", router) log.Fatal(http.ListenAndServe(":8080", router))}基本上,在我剛剛使用的處理程序上,然后在 goroutine 中WriteHeader調用該函數:sleepfunc index(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusAccepted) go sleep()}如果我想回復“200 OK”,我注意到我可以簡單地返回,例如:func index(w http.ResponseWriter, r *http.Request) { go sleep() return}因此想知道我是否應該總是返回我想關閉:func index(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusAccepted) go sleep() return}或者只寫標題然后調用 goroutine 就足夠了。
1 回答

小唯快跑啊
TA貢獻1863條經驗 獲得超2個贊
從處理程序返回就足夠了,并且是應該做的。引自http.Handler
:
返回請求完成的信號;在 ServeHTTP 調用完成之后或同時使用 ResponseWriter 或從 Request.Body 讀取是無效的。
請注意,最后的return
語句不是必需的,您可以簡單地省略它。執行在其最后一條語句執行時從處理程序返回,執行不等待從函數啟動的 goroutines 完成。(請注意,延遲語句會先執行,但這里沒有。)
同樣在返回時,如果未設置 HTTP 標頭,200 OK
將自動設置。因此,如果您愿意202 Accepted
,以下是最低要求:
func index(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusAccepted) go sleep()}
只需確保在從處理程序返回后不要在并發 goroutine 中使用http.ResponseWriter
andhttpRequest
值,因為它們可能會被重用,因此您甚至不應該嘗試讀取它們。
- 1 回答
- 0 關注
- 272 瀏覽
添加回答
舉報
0/150
提交
取消