golang 中可以通过以下步骤发送流数据请求:创建一个 http 请求并将其 content-length 设置为 -1。使用 pipereader 创建管道并从 goroutine 中写入数据。将管道连接到请求主体。使用默认客户端发送请求。读取并打印服务器响应。

如何使用 Golang 发送流数据请求?
简介
流数据请求是一种高效的方法,可以在不缓冲整个请求正文的情况下向服务器发送数据。在 Golang 中,可以使用 http.Client 和 http.Request 类型与 HTTP 服务器进行交互,并支持流数据请求。
立即学习“go语言免费学习笔记(深入)”;
代码实现
要发送流数据请求,需要执行以下步骤:
package main
import (
"bytes"
"fmt"
"io"
"net/http"
"time"
)
func main() {
url := "http://localhost:8080"
reader := bytes.NewReader([]byte("this is a streamed request"))
req, err := http.NewRequest("POST", url, reader)
if err != nil {
fmt.Println(err)
return
}
req.Header.Set("Content-Type", "application/octet-stream")
req.ContentLength = -1 // 设置 Content-Length 为 -1 以指示流请求
// 使用 PipeReader 来创建管道
reader, writer := io.Pipe()
// 在Goroutine中从管道写入数据
go func() {
time.Sleep(500 * time.Millisecond) // 等待 500 毫秒
for i := 0; i < 10; i++ {
fmt.Fprintln(writer, fmt.Sprintf("line %d", i))
time.Sleep(500 * time.Millisecond) // 每写一行休眠 500 毫秒
}
writer.Close()
}()
// 将管道连接到请求主体
req.Body = reader
// 发送请求
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// 读取并打印服务器响应
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
实战案例
上面的代码演示了如何在 Golang 中发送流数据请求。你可以运行该代码并将服务器端的 URL 替换为实际的服务器 URL,以向目标服务器发送流请求。服务器端代码可以使用 io.Read 函数从读取请求主体中的数据。










