Heim > Backend-Entwicklung > Golang > So erhalten Sie JSON-Daten von Connection Golang

So erhalten Sie JSON-Daten von Connection Golang

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2024-02-06 08:33:04
nach vorne
1212 Leute haben es durchsucht

So erhalten Sie JSON-Daten von Connection Golang

Frageninhalt

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]
    }
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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\"}]}
Nach dem Login kopieren

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\"}]}
Nach dem Login kopieren

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


Richtige Antwort


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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage