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