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
}
启动后按对应路由访问即可。 网关和启动源码在上文里
相关文章:
golang 工程组件:grpc-gateway option自定义http规则
option自定义http规则和http body响应 简介 本篇接上文 golang 工程组件:grpc-gateway 环境安装默认网关测试 默认网关配置终究是难用,本篇介绍一下proto里采用option自定义http规则以及让网关返回http响应而不是我们定义的grpc响应 option定义http…...
亚马逊添加购物车和收藏有什么区别
亚马逊的添加购物车和收藏是两个不同的功能,它们在用户行为和用途上有明显的区别: 1、添加购物车(Add to Cart): 当用户点击"添加到购物车"按钮时,所选商品将被放入他们的购物车,而…...
JAVA-编程基础-11-03-java IO 字节流
Lison <dreamlison163.com>, v1.0.0, 2023.05.07 JAVA-编程基础-11-03-java IO 字节流 文章目录 JAVA-编程基础-11-03-java IO 字节流字节输出流(OutputStream)FileOutputStream类**FileOutputStrea 的构造方法**使用文件名创建FileOutputStream…...
python之Cp、Cpk、Pp、Ppk
目录 1、Cp、Cpk、Pp、Ppk 2、python计算 1、Cp、Cpk、Pp、Ppk Cp Process Capability Ratio 可被译为“过程能力指数” Cpk Process Capability K Ratio 可被译为“过程能力K指数” Pp Process Performance Ratio 可被译为“过程绩效指数” Ppk Process Performance K Ra…...
统信uos 1030 企业版 安装.net core环境
安装.net core步骤 添加密钥和包存储库 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-mic…...
2023/10/23学习记录
1.VS2019中sln对应解决方案 修改sln的文件名,对应的解决方案名称也会变化。 2.如何修改生成的exe文件名呢? 属性--->杂项--->(名称) 3.这是任务管理器,这里红色部分显示的是“这是文件描述”。 当通过属性查看详细信息的时…...
flask入门(四)前后端数据传输
文章目录 1、flask后端接收来自前端的数据1)如果前端提交的方法为POST2)如果前段提交的方法是GET 2、flask后端向前端传数据3、案例参考文献 1、flask后端接收来自前端的数据 1)如果前端提交的方法为POST 后端接收时的代码: xx…...
JS——垃圾回收的原理
引言 JavaScript是一种高级的、解释型的编程语言,广泛应用于网页开发和移动应用开发中。在JavaScript中,内存管理是一个重要的话题,而垃圾回收就是内存管理的一部分。本文将介绍JavaScript垃圾回收的原理,并提供一些示例代码来帮助…...
Spring Cloud Gateway 路由构建器的源码分析
Spring Cloud Gateway 路由构建器的源码分析 文章目录 1. 路由构建器的入口2. 创建路由规则3. 设置路由规则和属性4. 路由过滤器的设置5. 构建和获取路由规则:6. 实例化路由构建器:8. 路由构建器的源码分析8.1 RouteLocator接口8.2 RouteLocatorBuilder…...
IT行业哪个方向比较好就业?
IT行业哪个方向比较好就业? IT行业里,哪些方向更好就业,这是一个很常见也很重要的问题。不同的IT方向有不同的技能要求、就业前景和发展空间,因此需要根据自己的兴趣、能力和目标来选择合适的方向。 软件开发与工程:软件开发是…...
uniapp中nvue页面使用fixed后,数据更改不更新到该视图。
解决方案:position: fixed;定位改成position: absolute; 记录一下,遇到这个贼离谱的问题,uniapp项目里的nvue页面因为要弄个引导蒙版,所以使用了fixed定位,点击蒙版关闭,加了this.$forceUpdate()也不行&am…...
力扣第55题 跳跃游戏 c++ 贪心 + 覆盖 加暴力超时参考
题目 55. 跳跃游戏 中等 相关标签 贪心 数组 动态规划 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true &…...
系列十四、Redis的集群(一)
一、是什么 1.1、概述 由于数据量过大,单个master-slave模式难以承担,当出现master节点故障的一瞬间,哨兵重新选举新的master节点之前,这一小段时间将会导致Redis服务不可用,因此需要对多个master-slave主从复制集进行…...
红帽认证 | RHCE考试包括哪些内容?
Red Hat Certified Engineer(RHCE)考试是一项面向企业级系统管理员的认证考试,是认证Linux系统管理员技能的一种方式。 RHCE证书是Linux管理员领域中最受欢迎和最受认可的证书之一。 那RHCE考试都有哪些内容呢,一起来看看吧&…...
ASPICE标准快速掌握「3.1. 实践示例」
实践示例 本章内容是最重要的,建议慢下来跟着博主的思路一步一步前进 1. 示例背景说明 假设我们现在是一个Tier1的车窗控制软件开发商,我们给OEM提供软件解决方案 1.1. 本过程目标 根据客户、上级部门、安全团队与质量团队等提出的要求,本项目要求SYS.1过程达到ASPICE过…...
pytorch 训练可视化
pytorch 训练可视化 1.from torch.utils.tensorboard 1.from torch.utils.tensorboard from torch.utils.tensorboard import SummaryWriter在最新版本的pytorch中官方提供了tensorboard的api。以下是官方教程的链接 https://pytorch.org/tutorials/intermediate/tensorboard…...
webgis开发参考资料
一、ArcGIS相关 1、ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用 http://zhihu.geoscene.cn/article/1038 2、arcgis server 紧促(bundle)格式缓存文件的读取 https://blog.csdn.net/abc553226713/article/details/8668839 3、ArcGIS 10.0紧…...
JSX 注意事项
学习目标: 掌握 JSX 实际开发过程中的一些注意事项 1. JSX 必须具有一个根节点,如果没有根节点可以使用<></>(幽灵节点)代替根节点将所有元素包裹起来 function App() {return (<><div className"App">1</div&…...
MQ常见的问题(kafka保证消息不丢失)
MQ常见的问题 1,mq如何避免消息堆积问题。 消息堆积:生产者的生产速率远远大于消费者的消费速率,使消息大批量的堆积在消息队列。 解决方案:1,提升消费者的消费速率(增加消费者集群) 2&…...
Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置
unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式,统一资源管理 AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置,比如当导入大量图片时,自动设置图片的类型,大小等。Ass…...
AI智能二维码工坊视频流识别:摄像头实时扫码部署教程
AI智能二维码工坊视频流识别:摄像头实时扫码部署教程 1. 项目简介 AI智能二维码工坊是一个全能型二维码处理工具,基于Python QRCode生成库与OpenCV视觉识别库构建。与依赖庞大深度学习模型的项目不同,本项目采用纯算法逻辑实现,…...
避坑指南:MediaPipe安装常见报错解决方案(附虚拟环境配置技巧)
MediaPipe实战避坑手册:从环境配置到高效开发的完整指南 在计算机视觉和机器学习领域,MediaPipe作为Google开源的多媒体处理框架,因其强大的实时感知能力和跨平台特性而备受开发者青睐。然而,许多开发者在初次接触MediaPipe时&…...
别再乱传props了!UniApp项目里用Vuex管理用户登录和购物车状态,保姆级配置流程
UniApp实战:用Vuex重构用户登录与购物车状态管理 每次看到项目里十几个组件层层传递props,我都忍不住想吐槽——这简直就像用快递员接力运送同一份外卖!特别是在处理用户登录状态和购物车数据时,这种"击鼓传花"式的状态…...
日期时间数据的运算
下面内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文6364字)。 2篇2章16节:R 语言中日期时间数据的关键处理要点_r语言从数字转为日期-CSDN博客 3、日期时间数据的运算 日期时间运算在分析中非常常见。R中的日期时间运算非常直观…...
AI赋能学术写作:六种智能文献引用生成与管理策略
核心工具对比速览 工具名称 核心优势 适用场景 处理速度 AiBiye 智能识别引用格式,自动匹配规范 学术论文初稿 3-5秒/页 AiCheck 深度检测引用缺失,精准定位问题 论文终稿检查 10秒/篇 AskPaper 多语言引用规范支持 国际期刊投稿 5-8秒/页…...
Java RAG入门基础教程(非常详细),用LangChain4j构建问答系统看这篇就够了!
1. 引言:为什么需要 RAG 1.1 大模型的局限性 在使用大语言模型(LLM)时,我们常常遇到以下问题: ❌ 问题 1:模型不知道企业内部信息用户:我们公司的年假政策是什么?AI:抱…...
Zotero插件进阶玩法:用这些神器打造你的专属文献工作流
Zotero插件进阶玩法:用这些神器打造你的专属文献工作流 如果你已经熟悉Zotero的基础操作,却还在手动整理文献、逐篇翻译PDF、反复切换浏览器查影响因子,那么是时候升级你的研究工具链了。本文将带你探索Zotero生态中那些能让学术工作事半功倍…...
避坑指南:SAP冲销原因配置常见错误及解决方案(附SPRO操作截图)
SAP FI模块冲销原因配置实战避坑指南 刚接触SAP FI模块的财务顾问们,在配置冲销原因时往往会遇到各种"坑"。这些看似简单的后台配置,一旦出错可能导致整个月结流程卡壳。本文将结合真实项目案例,带你避开那些教科书上不会写的配置陷…...
Mojo模块如何无缝注入PyTorch训练循环:从Cython替代到JIT热重载的完整链路(仅限内测版工具链公开)
第一章:Mojo模块如何无缝注入PyTorch训练循环:从Cython替代到JIT热重载的完整链路(仅限内测版工具链公开)Mojo模块通过原生ABI兼容层与PyTorch C前端深度对齐,无需修改torch.compile()调用栈即可嵌入训练循环。其核心机…...
避开这3个坑!用MateChat对接企业私有模型的实战经验分享
避开这3个坑!用MateChat对接企业私有模型的实战经验分享 当企业决定将AI能力深度整合到CRM系统时,数据安全和系统稳定性往往成为技术负责人最头疼的问题。去年我们为某跨国零售集团部署MateChat私有化方案时,曾因Ollama服务崩溃导致整个销售团…...
