2012-06-19 39 views
3
我无法找到一个答案

简单的问题..REST风格的URL中使用不同的字段,以获取资源

如果我有一个REST Web服务,而我的设计不使用URL参数,我怎么能指定两个不同的键返回相同的资源?

例 我想(和已实施)

/Person/{ID} 

预期它返回一个人。

现在我也想

/Person/{Name} 

它的名字返回的人。

这是正确的RESTful格式吗?或者是这样的:

/Person/Name/{Name} 

回答

4

您应该只使用一个URI来引用单个资源。拥有多个URI只会造成混淆。在你的例子中,由于两个同名的人会产生混淆。他们指的是哪一个人资源?也就是说,你可以让多个URI指向一个资源,但对于除“真实”URI之外的任何其他资源,只需使用状态码301 - Moved Permanently将客户端重定向到正确的位置即可。

就我个人而言,我永远不会实现多ID方案或重定向来支持它。选择一个识别方案并坚持下去。你的API的用户会感谢你。

您真正需要构建的是一个查询API,因此请专注于如何实现类似于/personFinder资源的资源,该资源可能会将名称作为参数,并在响应中返回潜在的多个匹配的/person/{ID} URI。

1

我想从技术上,你可以同时拥有的URI指向相同的资源(也许他们中的一个作为典型的资源),但我想你不会想从这样做实施视角。如果ID和名称之间有重叠,该怎么办?

它肯定不会看起来像使用查询参数的好地方,但如果你坚持不这样做,也许你可以做

person/{ID} 

personByName/{Name} 
+0

我认为会有一个标准的做法,似乎对我来说很普遍。感谢您的输入。 – Erix

+0

我认为这样做的最标准方法就是你已经排除了 - 查询参数。顺便说一句,你的URL的内容并不会使它成为RESTful,但这似乎并不是问题的核心。 – pc1oad1etter

+0

如果你只是创建一个新的URI模式来进行名称搜索(比如/ personByName/{Name},那么你最终会为每个你想到的新参数(以及这些参数的每个组合)创建一个新模式。对于这种可能性你可以做到这一点,我感觉很好,你可以这样做。然而,更为标准的做法是让/ person?name = {Name}返回匹配的人员列表按名字。 – pc1oad1etter