Goa框架中如何用基础类型作为路由路径参数?
解决goa.design基础类型作为路由路径参数的报错问题
当使用goa.design将自定义基础类型作为路由路径参数时,若直接将类型作为方法Payload,会触发Route param "XXX" not found in method payload错误——这是因为goa无法自动将路径占位符与单一值类型的Payload关联。以下是两种正确实现方式,均能保证最终生成type InstanceID int的目标类型:
方式一:显式绑定路径参数到Payload
通过Param将路径参数映射到整个Payload(Payload本身就是InstanceID类型的单一值):
var InstanceID = Type("instance_id", Int, func() { Description("the id of an instance") }) Method("get_instance_metadata", func() { Payload(InstanceID) HTTP(func() { GET(fmt.Sprintf("%s/instance/{id}", BaseAPIPath)) // 将路径参数id绑定到整个Payload Param("id", "payload") }) Result(InstanceMetadata, "the metadata of an instance") })
方式二:用Attribute包装基础类型为Payload字段
将Payload定义为包含InstanceID字段的结构体,此方式不影响InstanceID本身的生成类型,同时路径参数名可直接对应字段名:
var InstanceID = Type("instance_id", Int, func() { Description("the id of an instance") }) Method("get_instance_metadata", func() { Payload(func() { Attribute("instance_id", InstanceID, func() { Description("the id of an instance") }) Required("instance_id") }) HTTP(func() { GET(fmt.Sprintf("%s/instance/{instance_id}", BaseAPIPath)) }) Result(InstanceMetadata, "the metadata of an instance") })
两种方式均可解决goa gen的报错,且不会生成冗余的结构体类型。
内容的提问来源于stack exchange,提问作者IsaIkari
相关产品推荐
相关产品推荐

