使用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 等)。

相关推荐
上天_去_做颗惺星 EVE_BLUE19 小时前
Ubuntu Android 虚拟机安装使用教程
android·linux·测试工具·ubuntu·安卓
测试老哥21 小时前
接口测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
川石课堂软件测试2 天前
零基础小白如何学习自动化测试
python·功能测试·学习·测试工具·jmeter·压力测试·harmonyos
川石课堂软件测试2 天前
作为一名测试工程师如何学习Kubernetes(k8s)技能
学习·测试工具·容器·职场和发展·kubernetes·测试用例·harmonyos
Luminbox紫创测控2 天前
太阳模拟器自动化测试系统:稳态、脉冲、闪光光源的控制与数据采集
人工智能·测试工具·测试标准
一氧化二氢.h2 天前
图中元件的执行顺序
测试工具·jmeter
我的xiaodoujiao3 天前
API 接口自动化测试详细图文教程学习系列24--如何用Pytest去设计接口测试用例并执行
python·学习·测试工具·pytest
Pluchon3 天前
萌萌技术分享笔记——Java综合项目
java·开发语言·笔记·git·github·mybatis·postman
我的xiaodoujiao3 天前
API 接口自动化测试详细图文教程学习系列23--结合Pytest框架使用4-前后置处理
python·学习·测试工具·pytest