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