问题描述
我有一个带有标识符ID和属性名称的资源-名称对于每个资源实例都是唯一的。
为了获取,修补和删除资源,使用名称字段是否符合REST和JSON:API 作为网址中的标识符?
例如要通过名称获取资源,是否符合以下URL:
获取/ resource / {name}
或以下是要使用的/首选:
GET / resource?name = {name}
要按名称修补或删除,可以使用一种:
PATCH /资源/ {名称}
删除/ resource / {name}
解决方法
为了获取,修补和删除资源,使用名称字段作为URL中的标识符是否符合REST和JSON:API?
是的。 REST不在乎您为资源标识符使用什么拼写,只要这些标识符与RFC 3986中定义的生产规则一致即可。
这可能意味着您需要编码属性名称-例如,用等效的十六进制表示形式替换一些保留字符。
GET /resource/{name}
PATCH /resource/{name}
DELETE /resource/{name}
很好
GET /resource?name={name}
PATCH /resource?name={name}
DELETE /resource?name={name}
还可以。这是一个权衡;将信息编码为路径段意味着您可以利用相对引用和点段。在查询部分中使用键值对意味着您可以使用HTML表单来允许客户端指定名称。
GET /resource?name={name}
DELETE /resource/{name}
从技术上讲,您可以玩混合搭配,但是通用缓存不会知道您很聪明,并且当URI不同时也不会invalidate缓存条目。
此答案完全忽略了它也应符合JSON API specification。
这是公平的评论。
JSON:API specification对URI中使用的拼写约定没有引入任何重大限制。
但是,确实希望可以使用application / x-www-form-urlencoded键值对扩展标识符,以支持sorting,pagination,filtering等。
(警告:在阅读JSON:API规范时请小心,因为在resource的上下文中,“资源”的使用与REST的含义不一致。)
JSON:API recommendations for URI design鼓励使用路径段来引用“资源”,就好像它们是单个“参考文档”中可单独寻址的hierarchically organized元素一样。
此外,建议还要求使用特定的层次拼写,使用资源的类型和标识符来计算其URI
/{type}/{id}
换句话说,GET /resource/{name}
应该返回一个application/vnd.api+json
表示形式,其中包含一个type
成员resource
和一个id
成员name
。规范应用了附加约束,此(类型,id)组合必须为unique。
如果name
只是一个属性,而实际上不是标识符,那么您将JSON:API recommends视为过滤器
/resource?filter%5Bname%5D=abcde
返回的表示形式将包含一个self链接关系,该链接关系以通常的方式跟踪标识符。
(注意:[]为RFC 3986 gen-delims,因此在查询部分需要十六进制编码。至少一个JSON:API示例includes a note对此进行了解释,但建议中的过滤示例并未强调在实践中,您可能会不使用它们而不进行编码-在查询部分中使用方括号是常见的不合规惯例。