我的数据模型有两个资源:Folder
和Messages
。每条消息都属于一个文件夹。有时我会想要获取文件夹列表(包括每个文件夹的一些字段)。有时我会想要获取特定文件夹的详细信息(包括该文件夹的一些字段和消息)。
在Rails / RESTful系统中,这将对应index
资源上的show
和Folder
操作;后者将收到指定所需文件夹的id
参数。这个模式在“惯用”GraphQL中会是什么样子?
一种方法可能是每个操作都有一个字段:
type Query {
folders: [Folder]
folder(id: String!): Folder
}
这里有一些重复,这看起来很混乱,让客户更难以反省和理解架构。
也许可以使用可为空的参数删除重复:
type Query {
folder(id: String): [Folder]
}
如果传递id
,则只返回Folder
的详细信息(作为单项数组)。如果id
为nil
,则会获取所有文件夹的详细信息。这种重载似乎增加了一些隐藏的复杂性。
哪种方法是“更好的做法”?有没有更好的方法来模拟这种情况?
答案 0 :(得分:2)
TLDR:字段很便宜,使用它们。
我建议采用第一种方法。以同样的方式,REST API可能会被标记混乱以触发不同的行为,因此具有各种参数的字段也是如此。通过创建两个不同的字段,您还可以让类型系统提供更强大的客户保证:
type Query {
folders: [Folder!]!
folder(id: String!): Folder
}
在这种情况下,您总是可以获得folders
的某种列表,但它不会包含任何null
。空虚只是空名单。 API文档本身,如果您尝试将越来越多的可选参数混合到一个字段中,则可能不是这种情况。
此外,如果您需要对folders
进行分页,那么您将需要针对该端点的特定于分页的参数,以及connection pattern的中间结构。
答案 1 :(得分:0)
我使用第二种方法。通过这种方式,您可以稍后向同一端点添加更多参数。也许文件夹有一个路径,或者你想在创建日期过滤。