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

So erhalten Sie JSON-Daten von Connection Golang

WBOY
WBOYnach vorne
2024-02-06 08:33:041140Durchsuche

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]
    }
}

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


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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen