使用Postman测试grpc接口-传参错误的反例

上述postman设置了两个参数

实际调试发现:第一个参数没有传过来

我是根据包装参数的变量名称传入,为何有错?调查发现:

PipeCenterP3dAndEntityGuidsMessage里面 的变量是P3DGuid,不是根据这个单词来设置。

要以 .proto 里声明的字段名为准。

也就是说:

  • Proto 字段名是 P3dGuid(这里是 3d 里的小写 d),不是 P3DGuid
  • 二进制 gRPC 编码只认字段编号 12,和你在 JSON 里怎么写无关;JSON 映射一般会把 P3dGuid 变成 p3dGuid(lowerCamelCase),EntityGuid 变成 entityGuid

C# 生成代码里有时会看到 P3DGuid 这种属性名,那是 C# 的命名/缩写规则从 P3dGuid 推出来的,不等于要在 .proto 或 JSON 里写成 P3DGuid

结论:

  • .proto 时,以 P3dGuid / EntityGuid 为准。
  • Postman 发 JSON 时,优先用 p3dGuid / entityGuid;若你工具选项是「按 proto 字段名」,则用 P3dGuid / EntityGuid(注意仍是 P3dGuid,不是 P3DGuid)。

修改postman再次验证:

这次正常获得了参数:

都修改为小写,两个参数没有内容了。这说明,参数名称要和proto文件完全一致才行。

知识点:关于UnaryServerHandler技术简介

在 gRPC 里,Unary 表示 「单次请求 → 单次响应」(不是流式)。
UnaryServerHandler(名字可能因语言/包略有不同)一般指:服务端用来处理这一条 Unary RPC 的委托/回调------也就是「收到一个已反序列化的请求对象,你要返回一个响应(或 Task)」的那层包装。

可以理解为:框架把「调用你的业务方法」这件事,包成一个 Handler,方便在管道里串联(例如拦截器里 await next(...))。

是谁调过来的

不是你的业务代码主动去调它,而是 gRPC 服务端运行时在收到客户端请求后调用的,大致顺序是:

  1. 传输层:HTTP/2(常见是 Kestrel / 其它宿主)收到 gRPC 帧。
  2. gRPC 库:按 服务名 + 方法名 路由到已注册的实现。
  3. (可选)服务端拦截器链:若配置了 interceptor,会在 UnaryServerHandler(或等价的 next) 外包一层,先执行拦截逻辑,再 next 调进真正的 handler。
  4. 你的实现:最终进到 生成的 XXXServiceBase 上的 override,或你绑定的那个 Unary 处理委托。

所以:调用方 = gRPC 服务端框架(在 ASP.NET Core 上通常是 Grpc.AspNetCore + 宿主);你的 Service 方法是被它间接调用的。

和你项目的关系

你们 .proto 里定义的 rpc Foo(Req) returns (Res); 在服务端生成后,通常会对应 一个 Unary 的 server 方法;运行时收到 Foo 请求,就会走这条 Unary 管道,最后执行你在 XXXServiceBase 里写的 override Task<Res> Foo(...)

示例说明:

public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(

TRequest request,

ServerCallContext context,

UnaryServerMethod<TRequest, TResponse> continuation)

这是 Grpc.Core.Interceptors.Interceptor 里对 Unary(一元)RPC 的钩子:

每次客户端发起 「单次请求 → 单次响应」 的 RPC,服务端框架都会先走进这个 UnaryServerHandler,再(在合适时机)调用你传进来的 continuation

  • request:已反序列化后的请求对象。
  • context:本次调用的 ServerCallContext(含 MethodPeerCancellationToken 等)。
  • continuation:"下一棒",通常是 再往里走:下一个拦截器,或最终真正的 XXXGrpcService 里的 override 方法。你这里第 46、62 行的 await continuation(request, context) 就是在把请求交给后续处理链。

是谁调过来的

不是你手写的业务代码直接调用,而是 宿主在注册拦截器后,由 gRPC 服务端管道自动调用:

  1. Kestrel/HTTP2 收到 gRPC 请求;
  2. ASP.NET Core gRPC 宿主 解析方法、反序列化请求;
  3. 在调用具体 Service 实现之前,按注册顺序执行 Interceptor
  4. 执行到 GrpcLoggingInterceptor.UnaryServerHandler 时,就会进入你第 22 行这个 override

也就是说:调用方 = gRPC 服务端运行时(Grpc.Core + 你们在 Startup/Program 里挂的 Interceptor 管道)。


和上一个问题里 UnaryServerHandler 的关系

这里的 UnaryServerHandler 就是 拦截器机制里的"Unary 服务端入口":你在前后打日志、做 try/catch,中间通过 continuation(request, context) 把控制权交给 真正的 RPC 实现(例如 StandardDesignConfigGrpcService.HasAppliedStandardDesignPlanByPipeEntity 等)。

相关推荐
蒲公英内测分发7 小时前
Typeoff 实时润色体验:语音转文字让写作效率提升 3 倍
测试工具·产品运营·项目管理
Luminbox紫创测控9 小时前
氙灯太阳光模拟器加速老化测试
人工智能·测试工具·测试标准
wangl_9211 小时前
Wireshark 使用指南:从入门到高级分析
网络·网络协议·tcp/ip·测试工具·wireshark·modbus
wuchen100412 小时前
使用Postman测试grpc接口
postman·grpc
Byron Loong13 小时前
【网络】Wireshark过滤器表达式的规则
网络·测试工具·wireshark
MESMarketing14 小时前
互动分享 | Shift-Left实践落地
功能测试·测试工具·自动化·自动驾驶·敏捷开发
lifewange1 天前
主流性能诊断工具
测试工具
程序员杰哥1 天前
独立搭建UI自动化测试框架
自动化测试·软件测试·python·selenium·测试工具·ui·测试用例
PhotonixBay1 天前
激光共聚焦显微镜如何实现CVD石墨烯实时质量控制
人工智能·测试工具