Goa 是在 Go 中构建微服务和 API 的框架,采用独特的设计优先方法。使用前确保有 Go 语言环境。
Goa 1.4.0 距离上个正式版本发布已近一年,在这一年中,Goa 迎来了一些新特性和 Bug 修复。
Multipart Form Encoding
新增对 HTML 4 规范中描述的 multipart form encoding(也称 multipart/form-data)的原生支持。新的 MultipartForm 函数可用于 action design ,如下所示:
var _ = Resource("profiles", func() {
Action("submit", func() {
Routing(POST("profiles"))
Payload(ProfilePayload)
MultipartForm() // Uses "multipart/form-data" encoding
Description("Post accepts a multipart form encoded request")
Response(OK, ResultMedia)
})
})
Primitive File Type
新增将有效载荷属性映射到 multipart files 的功能,以便在 goa 中实现文件上传。 新的 File 类型可与 MultipartForm()结合使用,如下所示:
var _ = Resource("profiles", func() {
Action("submit", func() {
Routing(POST("profiles"))
Payload(ProfilePayload)
MultipartForm() // Uses "multipart/form-data" encoding
Description("Post accepts a multipart form encoded request")
Response(OK, ResultMedia)
})
})
var ProfilePayload = Type("ProfilePayload", func() {
Attribute("name", String, "Name")
Attribute("birthday", DateTime, "Birthday")
Attribute("icon", File, "Icon") // Attribute "icon" contains a file
Required("name", "birthday", "icon")
})
然后,管理员就可以轻易地访问文件内容,如下所示:
file, err := ctx.Payload.Icon.Open()
if err != nil {
return err
}
defer file.Close()
f, err := os.OpenFile("./icons/"+ctx.Payload.Icon.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
return fmt.Errorf("failed to save file: %s", err) // causes a 500 response
}
defer f.Close()
io.Copy(f, file)
新增可识别本不应由 LogRequest 中间件记录的标头值(header values)的能力。
middleware.LogRequest(true, "Authorization", "Api-Key", "Owner-Email")
新增指定只读属性的功能, 这些属性在生成的 OpenAPI 规范中标记为只读。
var TypeWithReadOnlyAttributes = Type("Foo", func() {
Attribute("standard", String)
Attribute("read-only", String, func() {
ReadOnly()
})
})
新增对 RFC3339 时间格式的支持。例如 2017-11-16
var TypeWithDate = Type("Foo", func() {
Attribute("date", String, func() {
Format("date")
})
})
使客户端可在 HTTP 请求查询字符串参数中提供用于授权的 JWT 认证。
该版本还包含许多 Bug 修复,完整更新内容可查阅:
领取专属 10元无门槛券
私享最新 技术干货