可以将属性值用作REST URL中的标识符

问题描述

我有一个带有标识符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键值对扩展标识符,以支持sortingpaginationfiltering等。

(警告:在阅读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对此进行了解释,但建议中的过滤示例并未强调在实践中,您可能会不使用它们而不进行编码-在查询部分中使用方括号是常见的不合规惯例。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...