Go と Gin を理解する過程で、リクエスト本文の取得で問題が発生する可能性があります。この記事では、問題を詳しく掘り下げ、特定のコンテキストに基づいた包括的な解決策を提供します。
外部 POST リクエストからリクエスト本文を読み取ろうとしていますが、出力は一貫しています。
この問題は、インターフェイス タイプ ReadCloser である c.Request.Body の文字列値を出力しようとすることで発生します。本文に予期したデータが含まれていることを確認するには、その値を文字列に抽出し、それを出力して理解できます。
<code class="go">func events(c *gin.Context) { x, _ := ioutil.ReadAll(c.Request.Body) fmt.Printf("%s", string(x)) c.JSON(http.StatusOK, c) }</code>
有益ではありますが、このメソッドはリクエスト本文へのアクセスには推奨されません。代わりに、Gin のバインディング機能を利用して、解析プロセスを簡素化します。
<code class="go">type E struct { Events string } func events(c *gin.Context) { data := &E{} c.Bind(data) fmt.Println(data) c.JSON(http.StatusOK, c) }</code>
このアプローチにより、リクエスト データが適切に処理され、c.Request.Body が枯渇するのを防ぎ、Gin が読み取れるようになります。
ioutil.ReadAll(c.Request.Body) を使用して本文を読み取ると、本文が枯渇し、Gin が読み取れなくなることに注意してください。
<code class="go">func events(c *gin.Context) { x, _ := ioutil.ReadAll(c.Request.Body) fmt.Printf("%s", string(x)) data := &E{} c.Bind(data) // data remains unchanged since c.Request.Body has been depleted. fmt.Println(data) c.JSON(http.StatusOK, c) }</code>
さらに、このエンドポイントからの JSON 応答には空の Request.Body が表示される場合があります。これは、JSON マーシャリング メソッドが ReadCloser をシリアル化できず、空の表現が生成されるためです。
以上がGin/Golang で空のリクエストボディを処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。