gpt4 book ai didi

go - 从 Go 服务器发送分块的 HTTP 响应

转载 作者:IT老高 更新时间:2023-10-28 13:05:40 25 4
gpt4 key购买 nike

我正在创建一个测试 Go HTTP 服务器,并且我正在发送一个 Transfer-Encoding: 分 block 的响应 header ,因此我可以在检索新数据时不断发送新数据。该服务器应该每秒钟向该服务器写入一个 block 。客户应该能够按需接收它们。

不幸的是,客户端(在本例中为 curl)在持续时间结束时(5 秒)接收所有 block ,而不是每秒接收一个 block 。此外,Go 似乎为我发送了 Content-Length。我想在最后发送 Content-Length,并且我希望 header 的值为 0。

这是服务器代码:

package main

import (
"fmt"
"io"
"log"
"net/http"
"time"
)

func main() {
http.HandleFunc("/test", HandlePost);
log.Fatal(http.ListenAndServe(":8080", nil))
}

func HandlePost(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Connection", "Keep-Alive")
w.Header().Set("Transfer-Encoding", "chunked")
w.Header().Set("X-Content-Type-Options", "nosniff")

ticker := time.NewTicker(time.Second)
go func() {
for t := range ticker.C {
io.WriteString(w, "Chunk")
fmt.Println("Tick at", t)
}
}()
time.Sleep(time.Second * 5)
ticker.Stop()
fmt.Println("Finished: should return Content-Length: 0 here")
w.Header().Set("Content-Length", "0")
}

最佳答案

诀窍似乎是您只需调用 Flusher.Flush()在写入每个 block 之后。另请注意,“Transfer-Encoding” header 将由作者隐式处理,因此无需设置。

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
flusher, ok := w.(http.Flusher)
if !ok {
panic("expected http.ResponseWriter to be an http.Flusher")
}
w.Header().Set("X-Content-Type-Options", "nosniff")
for i := 1; i <= 10; i++ {
fmt.Fprintf(w, "Chunk #%d\n", i)
flusher.Flush() // Trigger "chunked" encoding and send a chunk...
time.Sleep(500 * time.Millisecond)
}
})

log.Print("Listening on localhost:8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}

您可以使用 telnet 进行验证:

$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 200 OK
Date: Tue, 02 Jun 2015 18:16:38 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked

9
Chunk #1

9
Chunk #2

...

您可能需要做一些研究来验证 http.ResponseWriters 是否支持并发访问以供多个 goroutine 使用。

此外,有关 "X-Content-Type-Options" header 的更多信息,请参阅此问题。 .

关于go - 从 Go 服务器发送分块的 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26769626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com