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

上述postman设置了两个参数

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

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

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

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

也就是说:

  • Proto 字段名是 P3dGuid(这里是 3d 里的小写 d),不是 P3DGuid。
  • 二进制 gRPC 编码只认字段编号 1、2,和你在 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(含 Method、Peer、CancellationToken 等)。
  • 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 等)。

相关推荐
EVE จุ๊บ1 天前
playwright和selenium的区别是什么
selenium·测试工具
Meta Luo3 天前
页面改版后自动化用例大量失败,应该怎么维护?
运维·功能测试·测试工具·自动化
释槐鸟~3 天前
还不知道RIDE工具怎么装吗
测试工具·自动化
有技巧搬砖4 天前
为什么锂电池组的电池老化测试很重要?
测试工具·锂电池·电池老化
蒲公英内测分发4 天前
智能手表卖出去后,包装、说明书和官网里的 App 下载入口怎么统一?
前端·人工智能·测试工具·智能家居·智能硬件·智能手表
蒲公英内测分发4 天前
智能手环出海测试,海外合作方分散在不同国家,Android 测试包怎么持续分发和更新?
android·前端·人工智能·测试工具·智能手表
无语的小歪歪4 天前
ATF 智测 1.0
python·测试工具·集成测试
SHENGWEI胜为5 天前
交换机端口显示正常,终端却获取不到 IP 地址?从 DHCP 流程定位故障
服务器·网络·测试工具·缓存·通信工程
xie881018025 天前
长表格跨页重复表头:排版上的做法
测试工具
老孟说禅5 天前
测试工具示波器的使用
测试工具