正确构建包含不同REST端点的GraphQL API

时间:2018-03-20 01:36:49

标签: ruby graphql graphql-ruby

这是我在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请求就会产生两个API请求(客户没有请求cars上的任何字段,只是查询) 。查询是汽车的属性,所以我认为嵌套在cars下是有意义的吗?

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

我已经查看了连接,但我不确定这是否是他们的正确用例。具有设计可靠的GraphQL API经验的人能够称重吗?我应该尝试以某种方式利用工会或接口吗?非常感谢你。

0 个答案:

没有答案