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

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