登录
首页 >  Golang >  Go问答

处理连续的HTTP响应

来源:stackoverflow

时间:2024-02-06 23:35:26 416浏览 收藏

大家好,我们又见面了啊~本文《处理连续的HTTP响应》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我有以下示例,它连接到 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在循环中断后完成。

该程序确实有错误:

  • 程序仅在 EOF 时跳出循环。如果出现任何其他类型的错误,程序将永远旋转。
  • 程序不处理 ReadBytes 返回数据和错误的情况。可能发生这种情况的一个示例是响应不以分隔符结尾。

看起来您的目标是吸收对 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响应》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>