【问题标题】:GraphQL on top of REST APIREST API 之上的 GraphQL
【发布时间】:2017-12-11 06:38:46
【问题描述】:

早上好,伙计们,我目前正在编写基于 REST API 的 GraphQL。假设 JSON 响应是一个对象“用户”,其中包含 id、姓名、电子邮件和“地址”等元素,“地址”是一个由街道、套房、城市和邮政编码组成的对象。我应该如何在这个“地址”字段的架构中声明类型,其中包含多个元素。我已经看过文档,但无法理解我的场景的正确类型。

schema相关的sn-p如下:

export default new GraphQLObjectType({
    name: 'User',
    description: 'User(s) object in JSONPlaceholder Fake API',
    fields: () => ({
        id: {
            type: GraphQLID
        },
        name: {
            type: GraphQLString
        },
        username: {
            type: GraphQLString
        },
        email: {
            type: GraphQLString
        },
        address: {
            type: (?)
        }
    })
})

下面是我的目标 JSON API。

{
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
      "lat": "-37.3159",
      "lng": "81.1496"
    }
  },
  "phone": "1-770-736-8031 x56442",
  "website": "hildegard.org",
  "company": {
    "name": "Romaguera-Crona",
    "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
  }
}

我想创建单独的对象并创建解析器以仅获取该特定的“地址”对象,但这意味着我要查询两次。我认为可能有一些解决方法可以避免这种情况。

提前致谢!

【问题讨论】:

    标签: javascript json rest graphql


    【解决方案1】:

    正如您所提到的,您应该创建一个新的 GraphQLObjectType 来表示地址对象及其字段,然后将其设置为地址的类型。在这种情况下,由于字段名称与 JSON 有效负载匹配,因此不需要自定义解析器。

    如果您认为最终可能会重复调用 REST API,您可能会发现来自 facebook 的 dataloaders 库很有帮助。您可以使用它来确保对 REST API 的给定请求在每个请求中只发出一次。它还可以帮助解决其他问题,例如批处理。

    你的代码看起来像这样 -

    const AddressType = new GraphQLObjectType({
        name: 'AddressType',
        description: 'Address',
        fields: () => ({
            // then add all the fields on address  
        })
    })
    
    export default new GraphQLObjectType({
        name: 'User',
        description: 'User(s) object in JSONPlaceholder Fake API',
        fields: () => ({
            id: {
                type: GraphQLID
            },
            name: {
                type: GraphQLString
            },
            username: {
                type: GraphQLString
            },
            email: {
                type: GraphQLString
            },
            address: {
                type: AddressType
            }
        })
    })
    

    【讨论】:

    • 谢谢!,我认为实际上包含在 object 中的 object 可以像你上面所说的那样声明。奇怪的是,缓存机制可以根据 load() 方法或 DataLoader 对象内的 HTTP 请求中传递的参数检测到类似的请求吗?目前在我看来有很多解决方法,比如在 load() 方法中的花括号内传递参数,以及在 HTTP 请求中解包以进行修改,或者我只是调用一个函数,该函数接受返回 DL 对象的任何参数,这些参数只调用特定的负载(和操纵)论点?您推荐哪种方法?
    • 我已经使用了相当多的加载器,在我们的团队中,如果我们需要传递多个参数来加载,我们传递了一个对象(大括号中的参数来加载)。如果您这样做,则提供 cacheKeyFn 很重要,因为默认情况下它使用身份比较而不是值比较。对于以相同顺序提供键的小对象,它可以像设置 cacheKeyFn: JSON.stringify 一样简单
    猜你喜欢
    • 2020-12-12
    • 2019-11-06
    • 2018-03-10
    • 2021-11-23
    • 2020-01-21
    • 2020-05-28
    • 2020-09-17
    • 2018-03-19
    • 2021-04-25
    相关资源
    最近更新 更多