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

Это мой первый пост на stackru (Долгое время читатель). Я в основном из Питона и довольно плохо знаком с 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? Должен ли я пытаться использовать союзы или интерфейсы как-то? Огромное спасибо.

0 ответов

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