我正在为 RESTful API 设计自定义媒体类型,并研究了一些“标准”链接关系的类型和语义含义,以便为我的设计提供一些指导。
为了演示这个问题,假设我有一个可以执行标准读取、更改、删除方法的资源,并且我分别使用 GET、PUT 和 DELETE 的 HTTP 习惯用法来实现这些方法。
我可以合理地(重新)使用RFC5023中定义的“编辑”链接关系(来自IANA 链接注册表),其中规定:
"..."edit" 的值指定 href 属性的值是可编辑成员条目的 IRI。当出现在 atom:entry 中时,href IRI 可用于检索、更新和删除资源由那个条目代表......”
这样,用户代理可以理解具有“编辑”关系的链接将允许对资源进行 GET、PUT 和 DELETE。
然而,问题就在这里,如果资源状态被编辑使得资源现在只支持 GET 和 DELETE 操作,“编辑”关系就不再精确。
为了保持精度,我需要 i) 选项 A:指定另一个(复合)链接关系,仅支持 GET & DELETE,或 ii) 选项 B:为每个可能的状态转移指定单独的链接并使用适当的链接来指示允许的状态转移。后一种方法提供了精确性,但似乎过于冗长。
或者,(选项 C)我可以保留“编辑”关系并接受缺乏精度,即链接将传达 GET、PUT、DELETE 语义,但尝试 PUT 的用户代理将遇到 HTTP 错误' 405 - 不允许的方法'。但是,我对这种方法也不满意,因为它向客户端暗示了不支持的状态转换。
总而言之,问题是平衡链接关系通用性和精度的最明智的方法是什么?