我正在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?
答案 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,因此您最好使用处理程序执行工作,而不是将工作分派到其他地方。