已解决
golang 工程组件:grpc-gateway option自定义http规则
来自网友在路上 161861提问 提问时间:2023-10-25 18:53:46阅读次数: 61
最佳答案 问答题库618位专家为你答疑解惑
option自定义http规则和http body响应
简介
本篇接上文
golang 工程组件:grpc-gateway 环境安装+默认网关测试
默认网关配置终究是难用,本篇介绍一下proto里采用option自定义http规则以及让网关返回http
响应而不是我们定义的grpc
响应
option定义http规则和httpbody响应
引入库。可以直接拷贝grpc-gateway源码下google文件夹到项目下
import "google/api/annotations.proto";
import "google/api/httpbody.proto";
import "google/protobuf/empty.proto";
user.proto
syntax = "proto3";
package echo;
option go_package = "echo/proto";import "google/api/annotations.proto";
import "google/api/httpbody.proto";
import "google/protobuf/empty.proto";message User{int64 id = 1;// 改成下划线形式string userName = 2[json_name="user_name"];int32 age = 3;string phone = 4;Addr addr = 5;
}message Addr {string province = 1;string city = 2;string county = 3;
}service Echo{rpc Get(User) returns (User) {//get请求option (google.api.http) = {get: "/echo/user/{id}"};}rpc AddOrUpdate(User) returns (User) {option (google.api.http) = {post: "/echo/user"// * 表示接受user所有字段body: "*"additional_bindings {put: "/echo/user"body: "*"}//patch 请求,只更新部分字段additional_bindings {patch: "/echo/user"body: "addr"}};}rpc Delete(User) returns (User) {option (google.api.http) = {delete: "/echo/user/{id}"};}// httpbody响应,前面是grpc定义的消息rpc List(google.protobuf.Empty) returns (stream google.api.HttpBody) {option (google.api.http) = {get: "/echo/user/list"};}
}
对应grpc实现
server.go
package serverimport ("context""echo/proto""fmt""github.com/golang/protobuf/jsonpb"_ "github.com/golang/protobuf/jsonpb""google.golang.org/genproto/googleapis/api/httpbody"_ "google.golang.org/genproto/googleapis/api/httpbody""google.golang.org/protobuf/types/known/emptypb"_ "google.golang.org/protobuf/types/known/emptypb"
)type echoServer struct {proto.UnimplementedEchoServer
}func NewServer() proto.EchoServer {return &echoServer{}
}
func (s *echoServer) Get(ctx context.Context, in *proto.User) (*proto.User, error) {fmt.Printf("%+v\n", in)return in, nil
}
func (s *echoServer) AddOrUpdate(ctx context.Context, in *proto.User) (*proto.User, error) {fmt.Printf("%+v\n", in)return in, nil
}
func (s *echoServer) Delete(ctx context.Context, in *proto.User) (*proto.User, error) {fmt.Printf("%+v\n", in)return in, nil
}func (s *echoServer) List(in *emptypb.Empty, stream proto.Echo_ListServer) error {userList := []*proto.User{{Id: 1,UserName: "test1",Addr: &proto.Addr{Province: "深圳1",},},{Id: 2,UserName: "test2",Addr: &proto.Addr{Province: "深圳2",},},{Id: 3,UserName: "test3",Addr: &proto.Addr{Province: "深圳3",},},}for _, u := range userList {//jsonpb库序列化返回的才是下划线形式。 json序列化不读tag里定义m := jsonpb.Marshaler{}data, _ := m.MarshalToString(u)msg := &httpbody.HttpBody{ContentType: "application/json",Data: []byte(data),}stream.Send(msg)}return nil
}
启动后按对应路由访问即可。 网关和启动源码在上文里
查看全文
99%的人还看了
相似问题
- orvibo的Mini网关VS20ZW玩法
- 【Linux网络】搭建内外网的网关服务器,实现DNS分离解析与DHCP自动分配
- 电子电器架构 —— 车载网关边缘节点总线转换
- 搭建网关服务器实现DHCP自动分配、HTTP服务和免密登录
- EasyCVR视频监控+AI智能分析网关如何助力木材厂安全生产?
- 十一、统一网关GateWay(搭建网关、过滤器、跨越解决)
- 如何利用TSINGSEE青犀智能分析网关算法从人员、设备、行为三大角度进行监狱智能化升级改造
- 【从0到1设计一个网关】性能优化---使用Disruptor提供缓冲区
- 5G边缘计算网关 是什么?
- 基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(支持并行网关)
猜你感兴趣
版权申明
本文"golang 工程组件:grpc-gateway option自定义http规则":http://eshow365.cn/6-24384-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!