什么是 GraphQL?
GraphQL 是一种专为图状数据查询而设计的查询语言,其名称中的“Graph”即源于此。它与 SQL 的关系,好比“汉语”与“英语”虽然都带一个“语”字,但本质截然不同。同样,不要将它与 NoSQL 混淆——GraphQL 本身不绑定任何存储引擎,底层既可以是 NoSQL 数据库、SQL 数据库,甚至可以是文本文件或内存数据,灵活性极高。
GraphQL 接口是怎么传输的?

整个传输过程可分为以下关键步骤:
- 客户端首先编写一段 GraphQL 查询语句,明确所需数据格式——例如“查询某个用户的姓名和年龄”。
- 然后将该查询语句封装为 JSON 格式,放入 HTTP POST 请求的 body 中,发送至服务器指定的 GraphQL 接口。
- 服务器收到请求后,先校验语法正确性,再解析客户端实际需要的字段。
- 接着从数据源中提取对应数据,仅返回请求中指定的字段,并打包成 JSON 对象。
- 最后通过 HTTP 响应将 JSON 返回给客户端。
- 客户端解析响应 JSON,提取出所需的用户信息。
什么是 gRPC?
gRPC 是 Google 开源的高性能远程过程调用(RPC)框架,属于现代微服务架构中的热门技术。它基于 HTTP/2 传输协议,因此继承了 HTTP/2 的所有核心优势:
- 数据采用二进制分帧传输
- 支持多路复用
- 支持服务端主动推送
- 具备头部压缩机制
gRPC 接口是怎么传输的?

如上图传输模型所示,gRPC 接口调用流程十分清晰:客户端 Stub 通过 gRPC Core 库发起请求,将数据序列化为 Protobuf 格式,然后传输至服务端。服务端 Stub 收到请求后,先反序列化 Protobuf 数据,再将请求对象交由服务器处理业务逻辑。最终,将响应结果序列化后返回给客户端,完成一次接口调用。
gRPC VS GraphQL
界面设计
从定义上看,gRPC 与 GraphQL 本质上均为接口描述语言,用于规定计算机之间的通信协议。两者都支持生成多种编程语言的类型接口。关键区别在于:GraphQL 与传输层解耦,尽管通常运行于 HTTP 之上;而 gRPC 则紧密绑定 HTTP/2,这一差异对后续诸多特性产生了直接影响。
信息格式
- gRPC 采用二进制传输,消息体中仅包含数值本身,因此体积小、解析速度快。
- GraphQL 基于 JSON 文本传输,除了数值还需携带字段名,数据量相对更大。
- 二进制格式序列化效率更高,但调试时不如 JSON 直观——这是 JSON 的明显优势。
默认值
- gRPC 消息中不包含默认值,因此消息尺寸更加紧凑。
- GraphQL 允许为参数设置默认值,但请求字段本身不支持默认值设定。
请求格式
gRPC 每次只能调用一个方法。若所需业务数据分散在多个方法中,则需要依次调用。如果后续调用依赖前一次返回的结果,将导致多次网络往返,增加延迟。除非服务端与客户端处于同一数据中心,否则“欠获取(underfetching)”问题会明显影响体验。
向前兼容
在前向兼容方面,gRPC 和 GraphQL 均表现优异。这意味着服务端可以先行升级,而现有客户端无需同步修改,仍然能够正常工作。
传输
- gRPC 支持服务端向客户端推送数据,称为服务端流式(server streaming)。
- GraphQL 则通过订阅(Subscriptions)机制实现类似的数据推送功能。
使用 Apifox 发送 GraphQL
在 Apifox 中,首先创建一个 HTTP 项目,然后在接口地址栏输入 GraphQL 的服务端 URL,即可直接发起请求。整个操作流程十分简便直观。


使用 Apifox 发送 gRPC 请求
Apifox 支持基于 .proto 文件的 gRPC 调试,涵盖一元调用与流式调用。创建项目时选择“gRPC 项目”,然后导入 .proto 文件,无需编写代码即可直接调用 gRPC 接口。

调试 gRPC 接口前,需要先导入作为 API 定义的 .proto 文件。若某个 .proto 文件依赖其他 .proto 文件,则需要手动添加依赖关系目录。

一元调用
在地址栏填写目标 URL,直接点击“调用”按钮,即可发起一元调用。操作简单直接。

流式调用
流式调用覆盖服务端流、客户端流和双向流三种模式。发起调用后,可在 Message 标签下编写消息并发送,时间线视图会集中展示调用状态、已发消息和接收消息,信息一目了然。

关于 Apifox
- 集成 API 文档、API 调试、API Mock、API 自动化测试于一体的协作平台
- 提供更先进的 API 设计、开发和测试工具
- 简而言之,Apifox = Postman + Swagger + Mock + JMeter,一站式满足 API 全流程需求

知识扩展:
· 如何测试 gRPC 接口
· 如何使用 JMeter 请求 gRPC 接口?
