卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34138本站已运行391

如何从连接golang获取json数据

如何从连接golang获取json数据

问题内容

我使用 golang 编写的 tcp 连接从控制台发送curl 请求。所以它基本上是一个数据流。我可以使用以下代码成功接收数据并将其存储在缓冲区中

func PushDataToBuffer(bufferedChannel chan []byte, conn net.Conn) {
    defer conn.Close()
    fmt.Println("pushing messages into buffer...")

    buffer := make([]byte, 2048) // 2048 = assumption for reasonable event byte size

    for {
        n, err := conn.Read(buffer)
        if err != nil {
            fmt.Println("read error: ", err)
            continue // to continue listening for connections
        }
        bufferedChannel <- buffer[:n]
    }
}

但是,当我尝试使用此代码读取此数据时:

for data := range bufferedChannel {
    fmt.Println("The len of buffer is: ", len(bufferedChannel))
    dataObject := models.Event{}
    err := json.Unmarshal(data, &dataObject)
}

我收到以下错误

Invalid character 'P' looking for beginning of value
2024/01/29 09:40:31 syntax error at byte offset 1

当我打印出数据本身时,我看到了这个

POST / HTTP/1.1
Host: localhost:8952
User-Agent: curl/7.77.0
Accept: */*
Content-Type: application/json
Content-Length: 232

{"customer":"Ada","eventtype":"BuyingApples","time":"0001-01-01T00:00:00Z","specifics":[{"Key":"Shop","Value":"Bakery"},{"Key":"Location","Value":"Downtown"},{"Key":"recommends","Value":"yes"}]}

从上面你可以清楚的看出问题出在哪里了。它将标头添加到数据中,因此 POST 中的 P 就是 golang 所抱怨的。这就是为什么我无法解组它。所以我的问题是这样的: 我如何将数据发送到服务器,或者在数据到达时对其进行修剪,我将使用的只是 json 部分:

{"customer":"Ada","eventtype":"BuyingApples","time":"0001-01-01T00:00:00Z","specifics":[{"Key":"Shop","Value":"Bakery"},{"Key":"Location","Value":"Downtown"},{"Key":"recommends","Value":"yes"}]}

P.S - 我使用 tcp 连接来获取数据而不是 http

我在网上查找了各种解决方案,但没有找到适合我的用例的解决方案


正确答案


cURL 不是 TCP 客户端。它是一个 HTTP 客户端,自然会生成一些协议本机的标头(例如请求方法和路径)。这就是最终通过 TCP 连接发送的内容。因此,服务器期望的内容(普通 TCP)和客户端发送的内容(HTTP)不匹配。

您应该更新服务器代码,将原始数据解析为 HTTP 请求,例如 http .ReadRequest,或者简单地使用通过网络发送预期负载的客户端 - 即纯 TCP。 Netcat 将使这变得容易。在不太了解您要解决的问题的情况下,我默认推荐后一种方法(因为为什么在首先需要 TCP 时发送 HTTP?)。

卓越飞翔博客
上一篇: Go 中如何将字节转换为 float32 数组?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏