跳到主要内容

gRPC 接口

gRPC 是一种高效、快速、可靠的远程过程调用(RPC, Remote Procedure Call)框架,在多种不同的场景都有着广泛的应用。在微服务架构中,gRPC 可以实现跨服务的高效通信。对于需要大量数据传输的场景,gRPC 可以使用流式传输功能,以减少网络传输延迟和带宽占用。

注意
  • gRPC 接口调试功能正处于 Beta 公开测试阶段。Apifox 版本号需大于等于 2.3.0 才能够使用 gRPC 接口调试功能。

新建 gRPC 项目

点击 Apifox 首页的“新建项目”按钮,选择 “gRPC 项目(Beta)”。

导入 Proto

gRPC 是一种 API-First 的 API 技术,这意味着在开发之前,必须先通过 .proto 文件来定义服务、方法和消息。因此,使用 Apifox 调试 gRPC 接口之前,也需要先导入作为 API 定义的 .proto 文件。

首次导入

目前支持以下两种方式导入 .proto 文件:

  • 本地文件
  • 托管 .proto 文件的 URL

目标 .proto 文件会被导入为 1 个 Proto,其中 service 会被导入为服务,rpc 会被导入为方法。

如果选择的 .proto 文件依赖于其他 .proto 文件,那么需要手动添加依赖关系目录。

选择的 .proto 文件所依赖的其他 .proto 文件内的 service,如果其归属的 package 与选择的 .proto 文件的 package 相同,也会被导入到相同的 Proto 中。

重新导入

如果导入的 .proto 文件发生了变化,那么可以在 Apifox 内重新导入 .proto 文件:右键点击 Proto,然后点击重新导入按钮。

调用方法

使用 .proto 文件定义 gRPC 的方法时,支持 4 种类型:

  • Unary:一元调用
  • Server Streaming:服务端流
  • Client Streaming:客户端流
  • Bidirectional Streaming:双向流

Apifox 支持全部 4 种方法的调用。

一元调用

一元调用类似于 HTTP 请求。在地址栏输入 URL,在 Message 标签下以 JSON 格式输入消息内容,点击“调用”按钮,即可发起一元调用。

此外,你也可以手动填写 Metadata 和 Auth 信息,以满足鉴权或其他复杂场景。

流式调用

流式调用类似于 WebSocket 连接。在发起调用之后,你可以在 Message 标签下撰写消息并发送。服务端流、客户端流与双向流皆属于流式调用类型。

Apifox 提供了一个时间线视图,按照时间顺序集中展示调用状态、发送的消息、收到的消息。点击消息之后,可以非常方便地查看消息的详情。

进阶使用

自动生成动态值

Apifox 能够识别 .proto 文件中的内容,因此你可以点击“自动生成”按钮生成消息体。如果你需要使用更加灵活的动态数据,那么可以点击“动态值”功能配置并生成表达式。

详细说明请参考《动态变量/随机参数》

使用变量

你可以在 gRPC 的消息和 Metadata 中使用 Apifox 变量。

详细说明请参考《环境变量/全局变量/临时变量》

启用 TLS

gRPC 接口支持通过 TLS 建立安全的连接。

使用 Apifox,你可以点击 URL 前面的协议选择器来快速切换 TLS 的状态。

此外,Apifox 也兼容在 URL 中使用 grpcs:// 来为连接启用 TLS。与之相对应,grpc:// 表示不启用 TLS。

管理服务器地址与环境

你可以点击 URL 地址栏右侧的加号图标,将当前正在使用的服务器地址添加到一个环境。

然后,在右上角选择环境和服务器地址,再在 URL 地址栏中选择“跟随默认”,就可以给所有方法使用统一的服务器地址来进行调试。

查看 Proto 文件和接口参数

查看 Proto 文件内容

在 Apifox 中点击左侧目录树中的 Proto 即可查看 .proto 文件的原始内容。

查看请求和响应的参数

gRPC 使用 ProtoBuf 作为序列化格式,这意味着在发送、接收消息时,每条消息都以 ProtoBuf 格式进行传输。与其他基于文本的序列化格式(JSON、XML)不同,ProtoBuf 是一种二进制格式,不适合人类进行书写、阅读。因此,在 Apifox 中调用 gRPC 接口时,所有消息都使用 JSON 格式来撰写、展示。

你可以在接口信息页面查看以 JSON 形式表示的请求参数和响应参数。

ProtoBuf 和 JSON 的数据类型存在着映射关系,如下表所示:

ProtoBuf 3JSONJSON 示例
messageobject{"fooBar": v, "g": null, …}
enumstring"FOO_BAR"
map<K,V>object{"k": v, …}
repeated Varray[v, …]
boolbooleantrue, false
stringstring"Hello World!"
bytesbase64 string"YWJjMTIzIT8kKiYoKSctPUB+"
int32, fixed32, uint32number1, -10, 0
int64, fixed64, uint64string"1", "-10"
float, doublenumber1.1, -10.0, 0, "NaN", "Infinity"

gRPC 与 Triple

Triple 是一种兼容 gRPC 的 API 技术,它们都使用 gRPC 通信协议和 ProtoBuf 序列化格式。

如果你的 Triple 接口通过 .proto 文件进行定义,而不是 Java Interface 或其他方式定义,那么同样可以在 Apifox 的 gRPC 项目中加载 .proto 文件来调试 Triple 接口。

此时,URL 中的协议名 tri:// 和 grpc:// 是等价的。

保存调试信息

完成调试后可以点击“保存”按钮将服务器 URL、消息、Metadata 等调试信息保存在当前方法中,以便团队内的其他成员进行调试。