如何在GraphQL中建模“索引”列表与“显示”细节?

时间:2016-10-30 04:39:53

标签: rest restful-architecture graphql

我的数据模型有两个资源:FolderMessages。每条消息都属于一个文件夹。有时我会想要获取文件夹列表(包括每个文件夹的一些字段)。有时我会想要获取特定文件夹的详细信息(包括该文件夹的一些字段和消息)。

在Rails / RESTful系统中,这将对应index资源上的showFolder操作;后者将收到指定所需文件夹的id参数。这个模式在“惯用”GraphQL中会是什么样子?

一种方法可能是每个操作都有一个字段:

type Query {
  folders: [Folder]
  folder(id: String!): Folder
}

这里有一些重复,这看起来很混乱,让客户更难以反省和理解架构。

也许可以使用可为空的参数删除重复:

type Query {
  folder(id: String): [Folder]
}

如果传递id,则只返回Folder的详细信息(作为单项数组)。如果idnil,则会获取所有文件夹的详细信息。这种重载似乎增加了一些隐藏的复杂性。

哪种方法是“更好的做法”?有没有更好的方法来模拟这种情况?

2 个答案:

答案 0 :(得分:2)

TLDR:字段很便宜,使用它们。

我建议采用第一种方法。以同样的方式,REST API可能会被标记混乱以触发不同的行为,因此具有各种参数的字段也是如此。通过创建两个不同的字段,您还可以让类型系统提供更强大的客户保证:

type Query { folders: [Folder!]! folder(id: String!): Folder }

在这种情况下,您总是可以获得folders的某种列表,但它不会包含任何null。空虚只是空名单。 API文档本身,如果您尝试将越来越多的可选参数混合到一个字段中,则可能不是这种情况。

此外,如果您需要对folders进行分页,那么您将需要针对该端点的特定于分页的参数,以及connection pattern的中间结构。

答案 1 :(得分:0)

我使用第二种方法。通过这种方式,您可以稍后向同一端点添加更多参数。也许文件夹有一个路径,或者你想在创建日期过滤。