Правильное структурирование API GraphQL, который охватывает различные конечные точки REST

это мой первый пост о stackoverflow (давний читатель). Я в основном имею опыт работы с Python и довольно новичок в Ruby. Мне интересно, какой рекомендуемый способ структурировать Ruby GraphQL API, как показано ниже. Каждый из ключей имеет преобразователь, который запрашивает API разных веб-сайтов для получения связанных данных. В настоящее время они вложены в автомобили следующим образом (я удалил фактические источники http, с которыми они сталкиваются, поскольку вам нужны ключи api):

Types::CarsType = GraphQL::ObjectType.define do
  name "Cars"

  field :count, types.ID
  field :contact, types.String

  field :prices do
    type Types::PricesType
    resolve ->(obj, args, ctx) {
       HTTParty.get('http://example.com').parsed_response.fetch('some_key').map { |data| OpenStruct.new(data) }
    }
  end

  field :inquiries do
    type Types::InquiriesType
    resolve ->(obj, args, ctx) {
       HTTParty.get('http://example1.com').parsed_response.fetch('some_key').map { |data| OpenStruct.new(data) }
    }
  end
end

Types::InquiriesType = GraphQL::ObjectType.define do
  name "Inquiries"
  field :name, types.String
  field :phone, types.String
end
Types::PricesType = GraphQL::ObjectType.define do
  name "Prices"
  field :max, types.String
  field :min, types.String
  field :suggested, types.String
end
Types::QueryType = GraphQL::ObjectType.define do
  name 'Query'

  field :cars, types.String do
    type Types::CarsType

    argument :brand, !types[types.String]

    resolve ->(obj, args, ctx) {
       HTTParty.get('http://example2.com').parsed_response.fetch('some_key').map { |data| OpenStruct.new(data) }
    }
  end
end

Пример запроса:

query {
  cars(brand: "ford") {
    count
    contact

    prices {
      max
      min
      suggested
    }

    inquiries {
      name
      phone
    }
  }
}

Это работает нормально, но мне кажется, что этот подход не использует GraphQL в полной мере. Некоторые непосредственные проблемы, когда я смотрю на это, заключаются в том, что если бы вы сделали подобный запрос, теперь он сделал бы два запроса API, когда нужен только один (клиент не запрашивает никаких полей на cars, а только запросы). Справки - это атрибут авто, так что есть смысл вложить под cars?

query {
  cars(brand: "ford") {
    inquiries {
      name
      phone
    }
  }
}

Я изучил соединения, но не уверен, что это правильный вариант использования для них. Может ли кто-нибудь, имеющий опыт разработки надежных API-интерфейсов GraphQL, внести свой вклад? Стоит ли мне как-то пытаться использовать союзы или интерфейсы? Большое спасибо.

Почему вы используете «прокси GraphQL API» для другого API (REST)? Почему бы напрямую не использовать REST API? Выполнение 2 HTTP-запросов увеличивает вероятность тайм-аутов и других HTTP-ошибок буквально в 2 раза. Сможете ли вы в конечном итоге получить "сканер" для кэширования данных в вашем приложении, а затем GraphQL вместо этого запросил бы этот кеш?

MrYoshiji 20.03.2018 14:58

Привет. Если меня не интересует какая-либо информация об автомобилях, я хотел бы фильтровать запросы напрямую с аргументом inquiries (brand: "ford") { ... }, или нет? Сначала подумайте, каким должен быть ваш API, не заставляйте потребителя API всегда начинать только с нескольких типов.

Roland Studer 20.05.2018 22:28
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
2
223
0

Другие вопросы по теме