Http 如何在执行响应中不需要的计算之前向客户端发送响应

Http 如何在执行响应中不需要的计算之前向客户端发送响应,http,go,response,goroutine,Http,Go,Response,Goroutine,我们可以用如下语句发送响应(或在用户端写入): json.NewEncoder(w).Encode("some data") 在api中,在执行某些计算之前,响应中不需要这些部分,但需要存储在数据库中。我认为我们可以在更短的时间内给用户响应,函数的其他部分将继续工作,直到返回语句 如果我想的方向不对,请纠正我。一种方法是做其他goroutine中响应不需要的额外工作: func someHandler(w http.ResponseWriter, r *http.Request) {

我们可以用如下语句发送响应(或在用户端写入):

json.NewEncoder(w).Encode("some data")
在api中,在执行某些计算之前,响应中不需要这些部分,但需要存储在数据库中。我认为我们可以在更短的时间内给用户响应,函数的其他部分将继续工作,直到返回语句


如果我想的方向不对,请纠正我。

一种方法是做其他goroutine中响应不需要的额外工作:

func someHandler(w http.ResponseWriter, r *http.Request) {
    go func() {
        // Do anything here, this won't delay the response
        // But don't touch the writer or request, as they may not be available here
    }()

    if err := json.NewEncoder(w).Encode("some data"); err != nil {
        log.Printf("Error sending response: %v", err)
    }
}
请注意,在已启动的gorotuine中,您不能使用
http.ResponseWriter
http.Request
,因为它们仅在您从处理程序返回之前有效。如果你需要从他们那里得到一些东西,你必须在启动goroutine之前复制所需的部分

如果要在从处理程序返回之前完成附加任务,仍然可以使用goroutine,并使用
sync.WaitGroup
等待它完成,然后才从处理程序返回。您可以刷新响应,也可以不刷新响应:

func someHandler(w http.ResponseWriter, r *http.Request) {
    wg := &sync.WaitGroup{}
    wg.Add(1)
    go func() {
        defer wg.Done()

        // You may use the writer and request here
    }()

    if err := json.NewEncoder(w).Encode("some data"); err != nil {
        log.Printf("Error sending response: %v", err)
    }

    // Optionally you may flush the data written so far (icnluding HTTP headers)
    if flusher, ok := w.(http.Flusher); ok {
        flusher.Flush()
    }

    wg.Wait()
}

请注意,此处允许goroutine使用
http.ResponseWriter
http.Request
,因为处理程序在附加任务完成之前不会返回。

一旦写入响应,就无法更改它。您可以做的一件事是在发送响应之前使用数据,然后在发送后更改它。更具体地说,当json.NewEncoder().Encode行将在函数?thanx@icza中执行时。但更具体地说,我想知道,我们是否可以在函数执行之前或执行过程中在json.NewEncode(w)的“w”上编写响应,以便在该行之后也应该执行完整的代码,但响应应该已经在“w”上编写。(让我澄清一下,这一点之后的代码与响应无关)@RohitGhule是的,我建议的解决方案允许您这样做。谢谢@icza。它完全按照我的要求工作。@ RohitGhule然后考虑接受和投票的答案。