GoaはHTTPとgRPCの両方をサポートしています。トランスポートマッピングDSLを使用すると、 サービスメソッドをこれらのプロトコルを介して公開する方法を定義できます。
HTTP DSLは、サービスメソッドを HTTPエンドポイントにマッピングする方法を定義します。これは3つのレベルで設定できます:
すべてのサービスに適用されるグローバルなHTTP設定を定義します:
API("bookstore", func() {
HTTP(func() {
Path("/api/v1") // すべてのエンドポイントのグローバルプレフィックス
})
})
サービス内のすべてのメソッドのHTTPプロパティを設定します:
Service("books", func() {
HTTP(func() {
Path("/books") // サービス全体のパスプレフィックス
Parent("store") // パスのネストのための親サービス
})
})
個々のメソッドの特定のHTTP動作を定義します:
Method("show", func() {
HTTP(func() {
GET("/{id}") // HTTPメソッドとパス
Response(StatusOK) // 成功レスポンスコード
})
})
HTTP DSLは、エンドポイントを設定するためのいくつかの機能を提供します:
パスパラメータ
クエリパラメータ
ヘッダー
レスポンスコード
gRPC DSLは、サービスメソッドをgRPCプロシージャにマッピングする方法を定義します。 HTTPと同様に、複数のレベルで設定できます。
メッセージマッピング
ステータスコード
メタデータ
以下は一般的なトランスポートマッピングパターンです:
Service("users", func() {
HTTP(func() {
Path("/users")
})
Method("list", func() {
HTTP(func() {
GET("/") // GET /users
})
})
Method("show", func() {
HTTP(func() {
GET("/{id}") // GET /users/{id}
})
})
})
サービスはHTTPとgRPCの両方をサポートできます:
Method("create", func() {
// HTTPマッピング
HTTP(func() {
POST("/")
Response(StatusCreated)
})
// gRPCマッピング
GRPC(func() {
Response(CodeOK)
})
})
HTTP設計
gRPC設計
一般的なヒント
各トランスポートプロトコルには、独自のエラー表現方法があります: