我使用 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中文网其他相关文章!