首页 > 解决方案 > 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 请求有什么不同呢?它实际上不是也获取整个数据吗?它可以在发出请求时以某种方式“遍历”路由吗?

标签: restgraphql

解决方案


在您的示例中,服务器实际上确实从底层 REST API 获取整个响应。您的resolve函数只是为了获取特定字段的值而调用的函数。无论您axios.get在解析器内部还是外部调用都没有关系——它仍然会返回相同的东西。

但是,任何向 GraphQL 服务发出请求的客户端都必须指定要返回的字段(flight_numbermission_name等)。当客户端发出请求时,GraphQL 服务调用 REST API,获取完整响应,然后将其转换为反映客户端请求的字段。

这是否比直接调用 REST 端点更有效取决于很多因素。通过仅返回请求的字段,与 REST 端点返回的“完整”响应相比,GraphQL 响应负载可能会更小。但是,GraphQL 确实会增加开销,并且在客户端和 REST API 之间使用任何类型的代理也会增加延迟——这可能会或可能不会被较小有效负载的任何收益所抵消。也就是说,如果您在服务器上缓存来自 REST 端点的响应,则可以大大加快速度。


推荐阅读