go-kratos HTTP方法支持以及FieldMask的使用简介
kratos 的proto http 插件——protoc-gen-go-http
,对body以及query参数只能选择其一支持,不论其Method
为何种。query、vars支持同时存在。
源码可查:go-kratos/kratos/cmd/protoc-gen-go-http/template.go
。
和Google API 设计指南上对方法的设计有点不一样。
GET | POST | PUT | DELETE | |
---|---|---|---|---|
query (/hello?x=s) | 支持 | 支持 | 支持 | 支持 |
vars (/hello/{name}) | 支持 | 支持 | 支持 | 支持 |
body | 支持 | 支持 | 支持 | 支持 |
body与query同时存在:
1 | service Auth { |
Header中解析数据
1 | // client发上来的header保存在此处 |
请求中的参数解析
从test文件的示例可以看出,github.com/go-kratos/kratos/encoding/form/form_test.go
,解析URL中的嵌套数据的方法:
嵌套参数
1 | message HelloRequest { |
URL Query:
1 | http://localhost:8000/helloworld?ones.one=1234 |
数组参数
1 | Simples: []string{"3344", "5566"} |
FieldMask参数
1 | Field: &fieldmaskpb.FieldMask{Paths: []string{"1", "2"}} |
FieldMask
借助库:
https://github.com/mennanov/fmutils
https://github.com/mennanov/fieldmask-utils
不过当前Kratos对query中的fieldmask
会进行大写转换,导致其字段无法进行有效的Filter
。我提了一个issue。
fieldmask_utils是对字段名进行匹配,而不是tag名,而Kratos则会将Me ——> _me,而其字段为Me
,那库则无法将其正常过滤,正常GRPC协议不会出现此转换,此转换应该是Kratos HTTP decode request时发生的。
1 | import fieldmask_utils "github.com/mennanov/fieldmask-utils" |
FieldMask
用在response、request参数限制返回,以及指定参数的更新上。
request中指定paths,response根据paths mask参数,返回需要的字段。
Netflix API 设计实践(二): 使用FieldMask进行数据变更
1 | message UpdateProductionRequest { |
更新操作就会执行更新format
,schedule.planned_launch_date
两个字段,由于后者没有传值,变相的也就是将此字段置空。
本文标题:go-kratos HTTP方法支持以及FieldMask的使用简介
文章作者:小师
发布时间:2022-05-06
最后更新:2023-02-25
原始链接:chunlife.top/2022/05/06/go-kratos-HTTP方法支持以及FieldMask的使用简介/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可