简单的问题..REST风格的URL中使用不同的字段,以获取资源
如果我有一个REST Web服务,而我的设计不使用URL参数,我怎么能指定两个不同的键返回相同的资源?
例 我想(和已实施)
/Person/{ID}
预期它返回一个人。
现在我也想
/Person/{Name}
它的名字返回的人。
这是正确的RESTful格式吗?或者是这样的:
/Person/Name/{Name}
简单的问题..REST风格的URL中使用不同的字段,以获取资源
如果我有一个REST Web服务,而我的设计不使用URL参数,我怎么能指定两个不同的键返回相同的资源?
例 我想(和已实施)
/Person/{ID}
预期它返回一个人。
现在我也想
/Person/{Name}
它的名字返回的人。
这是正确的RESTful格式吗?或者是这样的:
/Person/Name/{Name}
您应该只使用一个URI来引用单个资源。拥有多个URI只会造成混淆。在你的例子中,由于两个同名的人会产生混淆。他们指的是哪一个人资源?也就是说,你可以让多个URI指向一个资源,但对于除“真实”URI之外的任何其他资源,只需使用状态码301 - Moved Permanently
将客户端重定向到正确的位置即可。
就我个人而言,我永远不会实现多ID方案或重定向来支持它。选择一个识别方案并坚持下去。你的API的用户会感谢你。
您真正需要构建的是一个查询API,因此请专注于如何实现类似于/personFinder
资源的资源,该资源可能会将名称作为参数,并在响应中返回潜在的多个匹配的/person/{ID}
URI。
我想从技术上,你可以同时拥有的URI指向相同的资源(也许他们中的一个作为典型的资源),但我想你不会想从这样做实施视角。如果ID和名称之间有重叠,该怎么办?
它肯定不会看起来像使用查询参数的好地方,但如果你坚持不这样做,也许你可以做
person/{ID}
和
personByName/{Name}
我认为会有一个标准的做法,似乎对我来说很普遍。感谢您的输入。 – Erix
我认为这样做的最标准方法就是你已经排除了 - 查询参数。顺便说一句,你的URL的内容并不会使它成为RESTful,但这似乎并不是问题的核心。 – pc1oad1etter
如果你只是创建一个新的URI模式来进行名称搜索(比如/ personByName/{Name},那么你最终会为每个你想到的新参数(以及这些参数的每个组合)创建一个新模式。对于这种可能性你可以做到这一点,我感觉很好,你可以这样做。然而,更为标准的做法是让/ person?name = {Name}返回匹配的人员列表按名字。 – pc1oad1etter