JSON aus einem Anforderungstext in Go abrufen
Bei der Arbeit mit POST-Anfragen, die JSON-Inhalte enthalten, ist es notwendig, die JSON-Daten zu extrahieren aus dem Hauptteil der Anfrage. Für Go-Anfänger, die Code aus Sprachen wie Node.js migrieren, kann dies jedoch eine rätselhafte Aufgabe sein.
Um dieses Problem anzugehen, wurden mehrere Ansätze versucht:
var v interface{}<br>err := json.NewDecoder(context.Request().Body).Decode(&v)<br>if err != nil {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return result, err
}
fmt .Println(v)
In diesem Beispiel ist das Ergebnis häufig leer, was darauf hinweist, dass der Körper leer ist. Dies liegt daran, dass http.Request.Body ein Puffer ist und sobald Daten daraus gelesen wurden, können sie nicht erneut gelesen werden.
Ein anderer Ansatz ist:
m := echo .Map{}<br>if err := context.Bind(&m); err != nil {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return result, err
}
fmt.Println(m)
Hier führt der Code zu einer Fehlermeldung von „EOF ." Dieser Fehler tritt auf, weil die Anfrage keinen Inhaltstyp-Header enthält, sodass Echo den Typ der gesendeten Daten nicht bestimmen kann.
Abschließend ein Versuch, den Text direkt zu lesen:
< pre>body, error := ioutil.ReadAll(context.Request().Body)
if error != nil {
return result, error
}
fmt.Println(body)
Ergibt ein leeres Byte-Array, da ioutil.ReadAll() den Anforderungstext verbraucht.
Die Lösung liegt im Verständnis der Natur von http.Request.Body als einen Puffer und einen Weg finden, ihn nach dem Lesen wiederherzustellen. Der folgende Codeausschnitt bietet eine Problemumgehung:
// Textinhalt lesen<br>var bodyBytes []byte<br>if context.Request().Body != nil {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
}
// Stellen Sie den io.ReadCloser in seinem ursprünglichen Zustand wieder her
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
// Den Körper weiterhin verwenden, z. B. ihn an eine Struktur binden:
order := new(models.GeaOrder)
error := context.Bind(order)
Mit dieser Problemumgehung ist es jetzt möglich, den Text zu lesen, seinen Inhalt für die spätere Verwendung aufzubewahren und seine Daten erfolgreich an eine Struktur zu binden.
Das obige ist der detaillierte Inhalt vonWie rufe ich JSON-Daten aus einem Anforderungstext in Go ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!