Heim  >  Artikel  >  Backend-Entwicklung  >  Wie rufe ich JSON-Daten aus einem Anforderungstext in Go ab?

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

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 10:34:06442Durchsuche

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

Stellungnahme:
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