rest - GraphQL 如何比 REST 更高效?
问题描述
让我们以 SpaceX 发射 API 为例。如果我使用 REST(在 Node.js 中)发出请求,它将看起来像这样:
router.get('https://api.spacexdata.com/v3/launches', function (req, res) {
// What to do with it
})
这将使我获得所有发射数据。
现在,使用 GraphQL,您只需指定所需的字段。
const LaunchType = new GraphQLObjectType({
name: 'Launch',
fields: () => ({
flight_number: { type: GraphQLInt },
mission_name: { type: GraphQLString },
launch_year: { type: GraphQLString },
launch_date_local: { type: GraphQLString },
launch_success: { type: GraphQLBoolean },
rocket: { type: RocketType }
})
})
但是.. 在查询中,您提供与 REST 版本路由相同的路由。
resolve(parent, args) {
return axios
.get('https://api.spacexdata.com/v3/launches')
.then((res) => res.data)
}
那么 GraphQL 请求有什么不同呢?它实际上不是也获取整个数据吗?它可以在发出请求时以某种方式“遍历”路由吗?
解决方案
在您的示例中,服务器实际上确实从底层 REST API 获取整个响应。您的resolve
函数只是为了获取特定字段的值而调用的函数。无论您axios.get
在解析器内部还是外部调用都没有关系——它仍然会返回相同的东西。
但是,任何向 GraphQL 服务发出请求的客户端都必须指定要返回的字段(flight_number
、mission_name
等)。当客户端发出请求时,GraphQL 服务调用 REST API,获取完整响应,然后将其转换为反映客户端请求的字段。
这是否比直接调用 REST 端点更有效取决于很多因素。通过仅返回请求的字段,与 REST 端点返回的“完整”响应相比,GraphQL 响应负载可能会更小。但是,GraphQL 确实会增加开销,并且在客户端和 REST API 之间使用任何类型的代理也会增加延迟——这可能会或可能不会被较小有效负载的任何收益所抵消。也就是说,如果您在服务器上缓存来自 REST 端点的响应,则可以大大加快速度。
推荐阅读
- r - 在循环中使用 mutate 创建变量
- javascript - 未从 Fetch API 定义的数组
- c++ - 如何定义布尔运算符来比较类的确切属性?
- python - 将日期格式添加到python中的现有文件路径时出现连接错误
- laravel - 我想要简单的数组而不是 [__ob__: Observer]
- reactjs - 在 React 中更改另一个组件的状态
- docker - 无法在远程 Kubernetes 中访问我的服务
- javascript - 删除方法在 React js 中不起作用。无法删除行
- java - 从数据库中获取枚举值时出错:没有枚举常量,嵌套异常是 java.lang.IllegalArgumentException
- arrays - Prolog:将树转换为顺序列表并检查列表是否已排序