【发布时间】:2014-01-30 19:44:05
【问题描述】:
我正在开发一项 REST 服务,并且我正在努力遵守 Roy Fielding 博士的约定和准则。
我将我的服务想象成一个公开一组资源的端点。资源由 URI 标识,api 客户端可以使用 HTTP 语义来操作资源(即,不同的 HTTP 动词映射到 URI 上的相应操作)。
指南规定这些 URI 应以分层方式定义,反映对象层次结构。这在资源创建中很有用,因为在后端我们需要数据来执行创建操作。但是,在进一步的操作中,URI 中包含的很多信息甚至不会被服务使用,因为通常仅资源 Id 就足以唯一标识操作目标。
一个示例:考虑一个公开产品创建和管理的 API。还要考虑产品与品牌相关联。在创建时,执行以下操作是有意义的: HTTP POST /品牌/{brand_id}/产品 [包含创建产品所需输入的正文]
该创建返回一个 HTTP 201,该 HTTP 201 使用一个位置标头创建,该标头公开了新创建的产品的位置。
在进一步的操作中,客户可以通过以下方式访问产品: HTTP PUT /品牌/{brand_id}/Product/{product_id} HTTP 删除 /Brand/{brand_id}/Product/{product_id} 等等
但是,由于产品 ID 在产品范围内是通用的,因此可以像这样执行以下操作: /产品/{product_id} 出于连贯性的原因,我只保留 /Brand/{brand_id} 前缀。事实上,服务忽略了品牌 ID。您是否认为这是一个很好的做法,并且为了保持清晰、明确的 ServiceInterface 定义是合理的?这样做有什么好处,这是否可行?
也将不胜感激任何有关 URI 定义最佳实践的指针。
提前致谢
【问题讨论】: