XML/JSON/YAML/ProtoBufレンダリング
Ginは、JSON、XML、YAML、Protocol Buffersなど、複数のフォーマットでのレスポンスレンダリングの組み込みサポートを提供しています。これにより、コンテンツネゴシエーションをサポートするAPI(クライアントが要求するフォーマットでデータを提供するAPI)の構築が簡単になります。
各フォーマットの使用場面:
- JSON — REST APIやブラウザベースのクライアントで最も一般的な選択肢。標準出力には
c.JSON()を、開発中の人間が読みやすいフォーマットにはc.IndentedJSON()を使用します。 - XML — レガシーシステム、SOAPサービス、またはXMLを期待するクライアント(一部のエンタープライズアプリケーションなど)との統合に便利です。
- YAML — 設定指向のエンドポイントやYAMLをネイティブに消費するツール(KubernetesやCI/CDパイプラインなど)に適しています。
- ProtoBuf — サービス間の高性能・低レイテンシ通信に最適です。Protocol Buffersはテキストベースのフォーマットと比較して、より小さなペイロードとより高速なシリアライズを実現しますが、共有スキーマ定義(
.protoファイル)が必要です。
すべてのレンダリングメソッドはHTTPステータスコードとデータ値を受け取ります。Ginはデータをシリアライズし、適切なContent-Typeヘッダーを自動的に設定します。
package main
import ( "net/http"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin/testdata/protoexample")
func main() { router := gin.Default()
// gin.Hはmap[string]interface{}のショートカットです router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) })
router.GET("/moreJSON", func(c *gin.Context) { // 構造体も使用できます var msg struct { Name string `json:"user"` Message string Number int } msg.Name = "Lena" msg.Message = "hey" msg.Number = 123 // msg.NameはJSONで"user"になることに注意 // 出力: {"user": "Lena", "Message": "hey", "Number": 123} c.JSON(http.StatusOK, msg) })
router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) })
router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) })
router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // protobufの具体的な定義はtestdata/protoexampleファイルに記述されています。 data := &protoexample.Test{ Label: &label, Reps: reps, } // データはレスポンスでバイナリデータになることに注意 // protoexample.Testのprotobufシリアライズデータを出力 c.ProtoBuf(http.StatusOK, data) })
// 0.0.0.0:8080でリッスンしてサーブ router.Run(":8080")}