【发布时间】:2018-12-15 19:17:12
【问题描述】:
我有很多资源,如产品、预订等。需要路线来按用户获取所有资源。
例如:
{GET} /bookings/user
我认为这是不正确的,因为这条路线会返回用户资源。还是我错了?
什么是正确的方法?
【问题讨论】:
标签: rest architecture routing restful-architecture restful-url
我有很多资源,如产品、预订等。需要路线来按用户获取所有资源。
例如:
{GET} /bookings/user
我认为这是不正确的,因为这条路线会返回用户资源。还是我错了?
什么是正确的方法?
【问题讨论】:
标签: rest architecture routing restful-architecture restful-url
我认为这是不正确的,因为这条路线会返回用户资源。还是我错了?
它返回由/bookings/user 标识的资源的表示。那是什么资源?这取决于源服务器。
rest 不关心您对标识符使用的拼写约定。就 REST 而言,/6414b60b-1ecb-4e28-8887-4bfe120810e7 是一个非常令人满意的资源标识符。
如果您想要人类可读的标识符,那也没关系。 RFC 3986 鼓励这种做法:
一个 URI 通常必须被人们记住,当它由有意义或熟悉的组件组成时,人们更容易记住它。
您还应该记住,RFC 3986 区分 URI 中的分层和非分层信号
URI 语法是分层组织的,组件按重要性从左到右递减的顺序列出。 -- section 1.2.3
路径组件包含通常以分层形式组织的数据,以及非分层查询组件中的数据 -- section 3.3
查询组件包含非分层数据,这些数据与路径组件(第 3.3 节)中的数据一起用于标识 URI 方案和命名权限(如果有)范围内的资源 --section 3.4
简而言之,如果您描述的是层次结构中描述的信息,那么使用路径段很有意义
我不返回用户和用户ID,需要返回所有授权用户的预订。
听起来您在描述/my/bookings 之类的拼写。
可能有助于 URI 设计的启发式方法是考虑 relative references 的好处;与文件系统一样,您可以使用点段导航到命名空间的根目录。
`/my/bookings` + `../profile` --> `/my/profile`
您可能不想支持hackable URI 的原因有;因此,您需要仔细考虑该约束及其含义。
【讨论】:
通常,为此会使用查询参数:
GET /bookings?userId={userId}
这将返回给定用户 ID 的所有预订。
【讨论】:
/bookings 提供预订。查询参数?userId= 指定一个过滤器以应用于返回的预订。在这种情况下,过滤器将只允许特定用户的预订。