如何从REST Api响应中组成一个graphQL查询?

时间:2019-04-21 18:09:37

标签: reactjs rest graphql apollo

我有一个REST API服务器的API响应,我使用REACT + Apollo和apollo-link-rest进行了调用。但是API的响应看起来像这样

[
 [
   {
    "name": "joe"
    "address": "123 street hello city"
   },
   {
    "name": "joe2"
    "address": "1233 street2 hello2 city"
   }
 ],
 2356
]

如何使用这种响应创建查询,该查询的数组的最后一项是数字,而数组的第一项则由用户列表组成?

到目前为止,我只有这个查询。

const QueryTest = gql`
  query people {
    people @rest(type: "People", path: "/allpersons")
  }
`;

2 个答案:

答案 0 :(得分:0)

第一个:您需要在name查询(内部)中使用addresspeople道具-“询问您需要什么”-以获取结果。

2nd:使用apollo-link-rest通常需要type patching-一种用于使现有(REST)响应适应/转换为当前需求(结构)的技术。可以将其与response transformer结合使用,但不需要执行此步骤。

有时您需要为嵌套类型(阿波罗标准化缓存要求)添加id(从其他字段计算,是唯一的)或在所需/必需类型之上定义其他“响应类型”-Google以获取类型补丁示例(例如patchDeeper用法)或教程...定义修补程序,使用调试器...

当您知道期望什么/需要什么时,要容易得多-将响应与有效的graphql响应进行比较。

答案 1 :(得分:0)

遇到同样的问题,您可以在链接中使用 responseTransformer 来转换响应。

const restLink = new RestLink({
    uri: '...',
    responseTransformer: async response =>
        response.json()
              .then((data: any) => {
                if (Array.isArray(data)) return { data }
                else return data
            })
});

所以你应该能够像这样使用查询:

const QueryTest = gql`
  query people {
    people @rest(type: "People", path: "/allpersons") {
      data
    }
  }
`;

其中 data 将包含:

[
 [
   {
    "name": "joe"
    "address": "123 street hello city"
   },
   {
    "name": "joe2"
    "address": "1233 street2 hello2 city"
   }
 ],
 2356
]