当前位置: 首页 > news >正文

golang 工程组件:grpc-gateway option自定义http规则

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
}

启动后按对应路由访问即可。 网关和启动源码在上文里

http://www.lryc.cn/news/204115.html

相关文章:

  • 亚马逊添加购物车和收藏有什么区别
  • JAVA-编程基础-11-03-java IO 字节流
  • python之Cp、Cpk、Pp、Ppk
  • 统信uos 1030 企业版 安装.net core环境
  • 2023/10/23学习记录
  • flask入门(四)前后端数据传输
  • JS——垃圾回收的原理
  • Spring Cloud Gateway 路由构建器的源码分析
  • IT行业哪个方向比较好就业?
  • uniapp中nvue页面使用fixed后,数据更改不更新到该视图。
  • 力扣第55题 跳跃游戏 c++ 贪心 + 覆盖 加暴力超时参考
  • 系列十四、Redis的集群(一)
  • 红帽认证 | RHCE考试包括哪些内容?
  • ASPICE标准快速掌握「3.1. 实践示例」
  • pytorch 训练可视化
  • webgis开发参考资料
  • JSX 注意事项
  • MQ常见的问题(kafka保证消息不丢失)
  • Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置
  • 用Flask快速生成报表
  • 关于时序预测可解释性预测
  • 泊车功能专题介绍 ———— AVP系统技术要求之场地规范定位要求
  • 【STM32】时钟设置函数(寄存器版)
  • 【DDD】贫血模型和充血模型
  • 【JS学习】字符串的substring方法
  • vue部署,chunk文件有部分404,解决方案
  • 《红蓝攻防对抗实战》六.常规反弹之利用NC在windows系统执行反弹shell
  • python如何创建自己的对冲交易算法
  • Ubuntu22.04安装,SSH无法连接
  • 解决dirsearch扫描工具pkg_resources模块警告问题