Ich habe also Folgendes, was unglaublich hackig erscheint, und ich habe mir gedacht, dass Go besser gestaltete Bibliotheken als diese hat, aber ich kann kein Beispiel für Go finden, das eine POST-Anforderung von JSON-Daten verarbeitet. Sie sind alle Form POSTs.
Hier ist eine Beispielanfrage: curl -X POST -d "{\"test\": \"that\"}" http://localhost:8082/test
Und hier ist der Code mit den eingebetteten Protokollen:
package main
import (
"encoding/json"
"log"
"net/http"
)
type test_struct struct {
Test string
}
func test(rw http.ResponseWriter, req *http.Request) {
req.ParseForm()
log.Println(req.Form)
//LOG: map[{"test": "that"}:[]]
var t test_struct
for key, _ := range req.Form {
log.Println(key)
//LOG: {"test": "that"}
err := json.Unmarshal([]byte(key), &t)
if err != nil {
log.Println(err.Error())
}
}
log.Println(t.Test)
//LOG: that
}
func main() {
http.HandleFunc("/test", test)
log.Fatal(http.ListenAndServe(":8082", nil))
}
Es muss einen besseren Weg geben, oder? Ich bin nur ratlos darüber, was die beste Praxis sein könnte.
(Go ist in den Suchmaschinen auch als Golang bekannt und wird hier erwähnt, damit andere es finden können.)
curl -X POST -H 'Content-Type: application/json' -d "{\"test\": \"that\"}"
, dannreq.Form["test"]
sollte zurückkehren"that"
Antworten:
Bitte verwenden Sie
json.Decoder
anstelle vonjson.Unmarshal
.quelle
defer req.Body.Close()
aus den Dokumenten Folgendes benötigen: "Der Server schließt den Anforderungshauptteil. Der ServeHTTP-Handler muss dies nicht tun." Zur Beantwortung von @thisisnotabus aus den Dokumenten: "Bei Serveranfragen ist der Anfragetext immer nicht null, gibt jedoch EOF sofort zurück, wenn kein Textjson.Decoder
. Es ist für Streams von JSON-Objekten vorgesehen, nicht für ein einzelnes Objekt. Es ist für ein einzelnes JSON-Objekt nicht effizienter, da es das gesamte Objekt in den Speicher liest. Es hat den Nachteil, dass sich Müll nicht beschwert, wenn er nach dem Objekt enthalten ist. Abhängig von einigen Faktorenjson.Decoder
wird der Text möglicherweise nicht vollständig gelesen, und die Verbindung kann nicht wiederverwendet werden.Sie müssen aus lesen
req.Body
. DieParseForm
Methode liest aus demreq.Body
und analysiert es dann im Standard-HTTP-codierten Format. Sie möchten den Text lesen und im JSON-Format analysieren.Hier ist Ihr Code aktualisiert.
quelle
req.ParseForm()
, was ich in früheren Versuchen getan habe, dieses Problem zu lösen, bevor Sie versuchen, das zu lesenreq.Body
, scheint es den Körperunexpected end of JSON input
Unmarshal
json.NewDecoder(req.Body)
beziehen, auch richtig.Ich habe mich mit genau diesem Problem verrückt gemacht. Mein JSON Marshaller und Unmarshaller haben meine Go-Struktur nicht gefüllt. Dann fand ich die Lösung unter https://eager.io/blog/go-and-json :
Danach haben mein Marshaller und Unmarshaller perfekt funktioniert!
quelle
Es gibt zwei Gründe,
json.Decoder
die bevorzugt werden solltenjson.Unmarshal
- die in der beliebtesten Antwort aus dem Jahr 2013 nicht angesprochen werden:go 1.10
eine neue Methode json.Decoder.DisallowUnknownFields () eingeführt , mit der das Problem der Erkennung unerwünschter JSON-Eingaben behoben wirdreq.Body
ist schon einio.Reader
. Wenn Sie den gesamten Inhaltjson.Unmarshal
lesen und dann ausführen, werden Ressourcen verschwendet, wenn der Stream beispielsweise ein 10-MB-Block mit ungültigem JSON war. Das Parsen des Anforderungshauptteils mitjson.Decoder
, während es einströmt, würde einen frühen Analysefehler auslösen, wenn ungültiger JSON festgestellt wird . Die Verarbeitung von E / A-Streams in Echtzeit ist der bevorzugte Weg .Adressierung einiger Benutzerkommentare zum Erkennen fehlerhafter Benutzereingaben:
Versuchen Sie Folgendes, um Pflichtfelder und andere Hygienekontrollen durchzusetzen:
Spielplatz
Typische Ausgabe:
quelle
Ich fand das folgende Beispiel aus den Dokumenten wirklich hilfreich (Quelle hier ).
Der Schlüssel hier war, dass das OP dekodieren wollte
... in diesem Fall würden wir die löschen
const jsonStream
und dieMessage
Struktur durch dietest_struct
folgende ersetzen :Update : Ich möchte auch hinzufügen, dass dieser Beitrag einige großartige Daten zur Antwort mit JSON enthält. Der Autor erklärt
struct tags
, was mir nicht bewusst war.Da JSON normalerweise nicht so aussieht
{"Test": "test", "SomeKey": "SomeVal"}
, sondern wie folgt{"test": "test", "somekey": "some value"}
, können Sie Ihre Struktur folgendermaßen umstrukturieren:... und jetzt analysiert Ihr Handler JSON mit "some-key" im Gegensatz zu "SomeKey" (das Sie intern verwenden werden).
quelle
quelle