如何在http.ListenAndServe处理程序之外编写HTTP响应?

时间:2019-05-07 23:05:47

标签: http go

我正在Go中设置一个HTTP服务器,告诉服务器使用putRequestOnQueue函数处理所有请求:

http.ListenAndServe(":6776", *handler)
http.HandleFunc("/", putRequestOnQueue)

putRequestOnQueue的工作是将响应编写器放在队列中,将其拉出并用于将来的某个时间返回响应。

func putRequestOnQueue(w http.ResponseWriter, r *http.Request){
    RequestQueue.Put(responseWriter)
}

但是,似乎ResponseWriter超出范围后,服务器会返回200。我可以想象这样做是因为它表明“哦,您告诉我的功能将处理该请求,只是失去了编写器,所以我只想吐200。”

但是我不希望这种行为。我希望能够选择其他功能时回写。有没有办法我可以写回另一个函数的响应而无需服务器过早返回200?

1 个答案:

答案 0 :(得分:1)

处理程序返回后,服务器将发送答复/状态。您将需要以下内容:

func putRequestOnQueue(w http.ResponseWriter, r *http.Request){
    RequestQueue.Put(responseWriter)
    waitForResponse()
}

换句话说,putRequestOnQueue在响应就绪之前不应该返回。例如,您可以使用频道或其他任何方式来进行此等待。


但是请注意,这不是非常惯用的Go。在Go中,我们不像其他语言那样做很多异步模式,因为goroutine很便宜。每个HTTP处理程序is already called in a separate goroutine,因此您最好使用处理程序执行工作,而不是将工作分派到其他地方