使用 Gin 的过程并不让我感觉愉快。跟其他 Go 的 web 框架一样,Gin 的一些设计真挺垃圾的……
默认的 JSON 实现会 escape HTML entity
使用 c.PureJSON()
而不是 c.JSON()
。后者会对 HTML entity 做转义。实在太 TM 蠢了。
URI 中无法使用 literal colon
Gin 支持在 URI 中使用 :
来表示一个 URI 参数:
POST /book/:id
但这套机制导致如果你 无法使用不带语义的冒号。比如你想使用 Google API Design Guide 推荐的 自定义动词 样式:
https://service.name/v1/some/resource/name:customVerb
那么其中的 :customVerb
会被 Gin 当作一个路径参数来解析,而不是保留其字面意义。
目前(2022 年 1 月)没有解决办法,这是 httproute 带来的限制。可行的 workaround 是不用冒号来表示 custom verb,换成点号(.
)或者其他。
API 错误信息不够用户友好
Gin 的 binding 功能,比如 c.ShouldBindJSON()
,假如遇到一个空的 HTTP 请求体,它返回的错误就是一句干巴巴的 EOF
。如果你期望你用 Gin 实现的 API 对用户足够友好,你不得不把 Gin 返回的各种乏味的错误信息再做一次包装。这点比 Django 差太多了……