我已经阅读了多个有关REST路由的最佳实践指南,但是没有一个指南可以回答如何使用具有唯一参数而不是ID的实体的方法。
因此,例如,我可以为实体USER提供 ID 和代码(均为唯一)。
通过ID进行简单获取的方式如下:
/users/{id}
并通过代码获取
/users/{code}
但是如果 ID 和 CODE 都是整数怎么办?
我可以使用查询字符串过滤器创建路由,例如:
/users?code=123
但是我想过滤路由应该返回用户列表,并且可能有多个参数导致返回用户列表。
/users?firstName=abcd
那么处理这样的实体的路由的最佳方法是什么?
答案 0 :(得分:1)
请记住,REST并不关心您用于标识符的拼写约定。两个URI相同,在这种情况下,客户端将假定它们引用相同的资源,或者两个URI不同,在这种情况下客户端将假定它们引用不同的资源。
/users/{id}
/users/{code}
在这种情况下,当您获取的整数不明确时,听起来好像您的问题是试图区分要使用的资源。
由于整数是不明确的,因此您需要在URI的其他地方进行区分。只要标识符与RFC 3986一致,REST就不会特别在意您的操作。
/ebc8a29b-76a5-4f40-b37a-2d40eab9283d/{id}
/9193590d-fc47-4107-a160-e344b9cedb5c/{code}
就REST而言,这是一个非常令人满意的解决方案。
/usersById/{id}
/usersByCode/{code}
这也完全令人满意,也许更容易被人类食用。
/users/id={id}
/users/code={code}
另一个令人满意的例子;这样可以提供可读性和共享的/users
路径段,如果要将相对引用嵌入到表示中,则可能会很方便。
Matrix parameters是一个常用术语,涵盖了在路径段中嵌入信息的多种不同方式。我们有合理的希望,如果您使用标准/第三方库来解析URI,那么将支持其中的某些或所有约定。
答案 1 :(得分:0)
如果Id和Code的值不同,则我更喜欢这种样式。 “ /用户/ {idOrCode}”。 我可以这样编写查询:where(x => x.Id == id || x.code == idOrCode)