Heim > Artikel > Backend-Entwicklung > So erhalten Sie JSON-Daten von Connection Golang
Ich verwende eine in Golang geschriebene TCP-Verbindung, um eine Curl-Anfrage von der Konsole zu senden. Es handelt sich also im Grunde um einen Datenfluss. Mit dem folgenden Code kann ich die Daten erfolgreich empfangen und im Puffer speichern
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] } }
Aber wenn ich versuche, diese Daten mit diesem Code zu lesen:
for data := range bufferedChannel { fmt.Println("The len of buffer is: ", len(bufferedChannel)) dataObject := models.Event{} err := json.Unmarshal(data, &dataObject) }
Ich erhalte die folgende Fehlermeldung
Invalid character 'P' looking for beginning of value 2024/01/29 09:40:31 syntax error at byte offset 1
Als ich die Daten selbst ausgedruckt habe, habe ich das gesehen
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\"}]}
Von oben können Sie deutlich erkennen, wo das Problem liegt. Es fügt den Daten Header hinzu, also ist POST
中的 P
das, worüber sich Golang beschwert. Deshalb kann ich es nicht unmarshalieren. Meine Frage lautet also:
Wie sende ich die Daten an den Server oder kürze sie, sobald sie ankommen? Alles, was ich verwenden werde, ist der JSON-Teil:
{\"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. – Ich verwende eine TCP-Verbindung, um die Daten abzurufen, anstelle von http
Ich habe online nach verschiedenen Lösungen gesucht, aber keine gefunden, die zu meinem Anwendungsfall passt
cURL ist kein TCP-Client. Es ist ein HTTP-Client und generiert natürlich einige für das Protokoll native Header (z. B. Anforderungsmethode und -pfad). Dies ist es, was letztendlich über die TCP-Verbindung gesendet wird. Daher besteht eine Diskrepanz zwischen dem, was der Server erwartet (einfaches TCP) und dem, was der Client sendet (HTTP).
Sie sollten Ihren Servercode aktualisieren, um die Rohdaten in eine HTTP-Anfrage zu analysieren, z. B. http .ReadRequest, oder einfach einen Client verwenden, der die erwartete Nutzlast über das Netzwerk sendet – also reines TCP. Netcat macht dies einfach. Ohne viel über das Problem zu wissen, das Sie lösen möchten, würde ich standardmäßig den letzteren Ansatz empfehlen (denn warum HTTP senden, wenn Sie überhaupt TCP benötigen?).
Das obige ist der detaillierte Inhalt vonSo erhalten Sie JSON-Daten von Connection Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!