Wie rufe ich JSON-Daten aus einem Anforderungstext in Go ab?

Linda Hamilton
Freigeben: 2024-10-31 10:34:06
Original
514 Leute haben es durchsucht

How to Retrieve JSON Data from a Request Body in Go?

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

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

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

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

}

// 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!

Quelle:php.cn
Vorheriger Artikel:Wie führe ich Befehle mit Argumenten in doppelten Anführungszeichen unter Windows mithilfe des exec-Pakets aus? Nächster Artikel:Warum ignoriert „go install“ meine „GOPATH“-Einstellung und installiert auf „GOROOT“?
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
Neueste Artikel des Autors
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage