根据 Restful 实践,REST API 端点中的 URI
URIs in REST API endpoints according to Restful practices
我计划为我们的 REST API 使用这些端点。
PUT /租户/:tenantId/users/save/:用户名
POST/租户/:tenantId/users/invite
获取/租户/:tenantId/users/fetch
GET /tenant/:tenantId/users/fetch/:用户名
补丁/租户/:tenantId/users/activate/:用户名
POST/租户/:tenantId/groups/save/
save/fetch/activate等动词是从连贯性的角度考虑的。这些 RESTFul 是否符合 REST 原则?如果有的话,应该如何改变这些?有什么建议吗?
RESTful URI should refer to a resource that is a thing (noun) instead of referring to an action (verb) because nouns have properties which verbs do not have – similar to resources have attributes.
还有
URIs should not be used to indicate that a CRUD function is performed. URIs should be used to uniquely identify resources and not any action upon them. HTTP request methods should be used to indicate which CRUD function is performed.
所以让我们以您的第一个 URI 为例
PUT /tenant/:tenantId/users/save/:username
这里你使用了动词保存。如前所述,您 不应该在 URI 中指示 CRUD 操作 ,在这种情况下使用 POST 会更合适。Here 是一个指南每个 HTTP 动词的目的。知道了这一点,我认为例如对于这种情况更合适的 URI 应该是
POST /tenants/:tenantId/users/:username
在这种情况下:
GET /tenant/:tenantId/users/fetch
GET /tenant/:tenantId/users/fetch/:username
您应该删除 fetch,因为您已经通过 GET 动词告知正在获取数据。第 6 个示例也是如此。
但是,这并不意味着您不能在您的 URI 中使用动词,事实上有一个特定的类别称为 controller,如同一指南中所述:
A controller resource models a procedural concept. Controller resources are like executable functions, with parameters and return values; inputs and outputs.
Use “verb” to denote controller archetype.
这个控制器资源可以很好地(我假设)例如你的
GET /tenant/:tenantId/users/activate/:username
.
但我认为动词 activate 应该放在最后:
GET /tenant/:tenantId/users/:username/activate
第一个注释:REST doesn't care what spelling conventions you use for your resource identifiers. Once you figure out the right resources, you can choose any identifiers for them that you like (so long as those identifiers are consistent with the production rules defined in RFC 3986).
“任何可以命名的信息都可以是资源”(Fielding, 2000), but its probably most useful to think about resources as abstractions of documents. We use HTTP as an application protocol whose application domain is the transfer of documents over a network.
- 得到
这是我们用来检索文档的方法
- 补丁
- 放置
- POST
这些方法都表示请求编辑文档(具体来说,编辑请求目标)。
PUT 和 PATCH 都要求服务器使其文档副本看起来像客户端的本地副本。想象一下将网页加载到编辑器中,进行更改,然后将这些更改“保存”回服务器。
POST 不太具体; “这是我们通过填写网络表格创建的文档,请自行适当编辑”。 It is okay to use POST:毕竟,Web 取得了灾难性的成功,我们仍在使用 POST 提交表单。
有用的工作是 side effect 这些编辑。
Are these RESTFul according to the REST principles?
它们像网站一样工作吗?如果它们像网站一样工作:意味着您点击链接,并通过提交表单将信息发送到服务器,或者编辑网页并将您的更改提交到服务器,那么它就是 REST。
一个技巧:在 REST 中 正常,单个方法 + 请求 uri 可能具有 不同 有用的副作用。我们可以有几种不同的 HTML 形式,它们都共享相同的 Form.action。如果编辑的是送货地址与账单信息或订单项目,则上传订单文档的更改可能会产生截然不同的效果。
正常并不意味着强制性 - 如果您更喜欢每个表单请求都转到特定资源的资源模型,那也可以。您获得了更简单的语义,但您支持更多的资源,这会使缓存变得更加棘手。
我计划为我们的 REST API 使用这些端点。
PUT /租户/:tenantId/users/save/:用户名
POST/租户/:tenantId/users/invite
获取/租户/:tenantId/users/fetch
GET /tenant/:tenantId/users/fetch/:用户名
补丁/租户/:tenantId/users/activate/:用户名
POST/租户/:tenantId/groups/save/
save/fetch/activate等动词是从连贯性的角度考虑的。这些 RESTFul 是否符合 REST 原则?如果有的话,应该如何改变这些?有什么建议吗?
RESTful URI should refer to a resource that is a thing (noun) instead of referring to an action (verb) because nouns have properties which verbs do not have – similar to resources have attributes.
还有
URIs should not be used to indicate that a CRUD function is performed. URIs should be used to uniquely identify resources and not any action upon them. HTTP request methods should be used to indicate which CRUD function is performed.
所以让我们以您的第一个 URI 为例
PUT /tenant/:tenantId/users/save/:username
这里你使用了动词保存。如前所述,您 不应该在 URI 中指示 CRUD 操作 ,在这种情况下使用 POST 会更合适。Here 是一个指南每个 HTTP 动词的目的。知道了这一点,我认为例如对于这种情况更合适的 URI 应该是
POST /tenants/:tenantId/users/:username
在这种情况下:
GET /tenant/:tenantId/users/fetch
GET /tenant/:tenantId/users/fetch/:username
您应该删除 fetch,因为您已经通过 GET 动词告知正在获取数据。第 6 个示例也是如此。
但是,这并不意味着您不能在您的 URI 中使用动词,事实上有一个特定的类别称为 controller,如同一指南中所述:
A controller resource models a procedural concept. Controller resources are like executable functions, with parameters and return values; inputs and outputs. Use “verb” to denote controller archetype.
这个控制器资源可以很好地(我假设)例如你的
GET /tenant/:tenantId/users/activate/:username
.
但我认为动词 activate 应该放在最后:
GET /tenant/:tenantId/users/:username/activate
第一个注释:REST doesn't care what spelling conventions you use for your resource identifiers. Once you figure out the right resources, you can choose any identifiers for them that you like (so long as those identifiers are consistent with the production rules defined in RFC 3986).
“任何可以命名的信息都可以是资源”(Fielding, 2000), but its probably most useful to think about resources as abstractions of documents. We use HTTP as an application protocol whose application domain is the transfer of documents over a network.
- 得到
这是我们用来检索文档的方法
- 补丁
- 放置
- POST
这些方法都表示请求编辑文档(具体来说,编辑请求目标)。
PUT 和 PATCH 都要求服务器使其文档副本看起来像客户端的本地副本。想象一下将网页加载到编辑器中,进行更改,然后将这些更改“保存”回服务器。
POST 不太具体; “这是我们通过填写网络表格创建的文档,请自行适当编辑”。 It is okay to use POST:毕竟,Web 取得了灾难性的成功,我们仍在使用 POST 提交表单。
有用的工作是 side effect 这些编辑。
Are these RESTFul according to the REST principles?
它们像网站一样工作吗?如果它们像网站一样工作:意味着您点击链接,并通过提交表单将信息发送到服务器,或者编辑网页并将您的更改提交到服务器,那么它就是 REST。
一个技巧:在 REST 中 正常,单个方法 + 请求 uri 可能具有 不同 有用的副作用。我们可以有几种不同的 HTML 形式,它们都共享相同的 Form.action。如果编辑的是送货地址与账单信息或订单项目,则上传订单文档的更改可能会产生截然不同的效果。
正常并不意味着强制性 - 如果您更喜欢每个表单请求都转到特定资源的资源模型,那也可以。您获得了更简单的语义,但您支持更多的资源,这会使缓存变得更加棘手。