首页 > 后端开发 > Golang > 正文

如何从连接golang获取json数据

WBOY
发布: 2024-02-06 08:33:04
转载
1138 人浏览过

如何从连接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?)。

以上是如何从连接golang获取json数据的详细内容。更多信息请关注PHP中文网其他相关文章!

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