Чем GraphQL более эффективен, чем REST? - PullRequest
0 голосов
/ 09 мая 2020

Возьмем для примера Api запусков SpaceX. Если я сделаю запрос с помощью 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? разве он не извлекает и все данные? Может ли он каким-то образом "пройти" маршрут, когда делает запрос?

1 Ответ

1 голос
/ 09 мая 2020

В вашем примере сервер действительно получает полный ответ из базового REST API. Ваша функция resolve - это просто функция, которая вызывается для получения значения определенного поля. Независимо от того, вызываете ли вы axios.get внутри преобразователя или вне его, не имеет значения - он все равно вернет то же самое.

Однако любой клиент, отправляющий запрос к вашей службе GraphQL, должен будет указать, какой поля (flight_number, mission_name, et c.) он хочет вернуть. Когда клиент делает запрос, служба GraphQL вызывает REST API, получает полный ответ и затем преобразует его, чтобы отразить поля, запрошенные клиентом.

Будет ли это более эффективным, чем прямой вызов конечной точки REST, зависит по множеству факторов. При возврате только запрошенных полей полезная нагрузка ответа GraphQL может быть меньше по сравнению с «полным» ответом, возвращаемым конечной точкой REST. Однако GraphQL действительно увеличивает накладные расходы, и наличие любого прокси-сервера между вашим клиентом и REST API также увеличивает задержку, которая может быть компенсирована или не компенсирована выгодами от меньшей полезной нагрузки. Тем не менее, если вы кэшируете ответы от конечной точки REST на своем сервере, вы можете немного ускорить процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...