GraphQL如何比REST更高效?

GraphQL如何比REST更高效?,rest,graphql,Rest,Graphql,让我们以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'

让我们以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请求有什么不同呢?它实际上不是也获取了全部数据吗?
当它发出请求时,它能否以某种方式“遍历”路由

在您的示例中,服务器实际上从底层RESTAPI获取整个响应。您的
resolve
函数就是用来获取特定字段值的函数。无论您在解析器内部还是外部调用
axios.get
,都无关紧要——它仍然会返回相同的结果

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


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

我建议您深入研究并查看差异,但要回答您的问题,不,除非您要求,否则它不会获取所有内容。如果您只对
航班号
任务名
感兴趣,它只会以您要求的相同格式返回数据
REST
将返回所有内容,而您不知道数据将如何构造。因此,如果我正在制作一个GraphQL to REST请求,那么增益(不考虑其他因素)应该是我将从本地服务器发送回客户端的较少响应数据。如果我发出一个GraphQL到GraphQL的请求,那么我就可以获得请求特定字段的全部潜力。我说得对吗?