7
通过URI与查询字符串设计REST API
假设我有三个相关的资源,如下所示: Grandparent (collection) -> Parent (collection) -> and Child (collection) 上面这样描述了这些资源之间的关系:每个祖父母可以映射到一个或几个父母。每个父母可以映射到一个或几个孩子。我希望能够支持针对子资源的搜索,但具有过滤条件: 如果我的客户给我传递了一个祖父母的ID参考,那么我只想搜索是该祖父母的直接后代的孩子。 如果我的客户向我传递了对父母的ID引用,我只想搜索父母直接后代的孩子。 我想到过这样的事情: GET /myservice/api/v1/grandparents/{grandparentID}/parents/children?search={text} 和 GET /myservice/api/v1/parents/{parentID}/children?search={text} 分别满足上述要求。 但是我也可以这样做: GET /myservice/api/v1/children?search={text}&grandparentID={id}&parentID=${id} 在这种设计中,我可以允许我的客户端向我传递查询字符串中的一个或另一个:grandparentID或parentID,但不能两者都传递。 我的问题是: 1)哪种API设计更RESTful,为什么?在语义上,它们的含义和行为方式相同。URI中的最后一个资源是“子代”,有效地暗示客户端正在子代资源上运行。 2)从客户的角度看可理解性以及从设计者的角度看可维护性方面,每种方法的优缺点是什么。 3)除了对资源进行“过滤”外,查询字符串的真正用途是什么?如果采用第一种方法,则将filter参数作为路径参数而不是查询字符串参数嵌入到URI本身中。 谢谢!