首页 > 后端开发 > Golang > 为什么我的 Go HTTP 服务器不逐步发送分块响应?

为什么我的 Go HTTP 服务器不逐步发送分块响应?

DDD
发布: 2024-12-09 09:21:09
原创
159 人浏览过

Why Doesn't My Go HTTP Server Send Chunked Responses Progressively?

来自 Go 服务器的 HTTP 块响应

在这个场景中,我们的目标是创建一个 Go HTTP 服务器,它发送一个分块的 HTTP 响应传输编码设置为“分块”。服务器打算以一秒的间隔写入块,从而允许客户端按需接收它们。然而,当前的实现面临着挑战:

  1. 客户端一次接收所有块,而不是按预期逐步接收。
  2. Content-Length 标头由 Go 自动设置,我们想要为 0 并添加到最后。

服务器代码

提供的服务器代码如下:

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")
}
登录后复制

解决方案

解决问题:

  1. http.ResponseWriter实现的“Flusher”接口允许我们通过调用Flush() 函数。通过在写入每个块后添加此内容,客户端可以在准备好时接收块。
  2. Transfer-Encoding 标头由 HTTP 编写器自动管理,因此不需要显式设置它。

已修订代码

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

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
...
HTTP/1.1 200 OK
Date: ...
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked

9
Chunk #1

9
Chunk #2

...
登录后复制

每个块将逐步接收为服务器发送它们。

以上是为什么我的 Go HTTP 服务器不逐步发送分块响应?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板