php小编子墨为您介绍处理流式 HTTP 响应的方法。在开发Web应用程序时,我们经常需要处理大文件的下载或者实时流媒体的传输。而传统的一次性加载整个响应内容的方式会导致内存占用过高,影响性能。为了解决这个问题,我们可以使用流式HTTP响应。流式HTTP响应可以将响应内容分块传输,减少内存占用,提高用户体验。在PHP中,我们可以使用一些库或者自定义方法来实现流式HTTP响应,从而优化我们的Web应用程序。
我有以下示例,它连接到 HTTP 服务,该服务将响应以块流的形式传回以创建 JSON 结构。对于每个块,我的代码附加一个字节 rb
数组和各个行。但是,我的问题是尝试在 rb
完成时解决,以便我可以对其进行解码。
我在这里遗漏了一些明显的东西吗?
package main import ( "bufio" "bytes" "fmt" "io" "net/http" ) func main() { body := []byte("test") resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() fmt.Printf("Status: [%s]\n", resp.Status) fmt.Println() //var rb []byte reader := bufio.NewReader(resp.Body) var rb []byte for { line, err := reader.ReadBytes('\n') if err != nil { if err == io.EOF { break } fmt.Printf("Error reading streamed bytes %v", err) } rb = append(rb, line...) fmt.Println(rb) } }
忽略程序中的bug,rb
在循环中断后完成。
该程序确实有错误:
看起来您的目标是吸收对 rb
的整个响应。使用 io.ReadAll 执行此操作:
resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() rb, err := io.ReadAll(resp.Body) if err != nil { // handle error } var data SomeType err = json.Unmarshal(rb, &data) if err != nil { // handle error }
如果你想将响应体解码为 JSON,那么更好的方法是让 JSON 解码器 读取响应正文:
resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() var data SomeType err := json.NewDecoder(resp.Body).Decode(&data)
以上是处理流式 HTTP 响应的详细内容。更多信息请关注PHP中文网其他相关文章!