是否可以对 get 和 post rest api 使用相同的资源名称

Posted

技术标签:

【中文标题】是否可以对 get 和 post rest api 使用相同的资源名称【英文标题】:Is it okay to use same resource name for both get and post rest api 【发布时间】:2015-03-09 16:32:23 【问题描述】:

以前我用 Java 开发了一个 Restful 服务,只有 1 个 GET 资源。它是这样访问的:

获取http://localhost:8080/my-project/customers/transactions

此 GET 请求返回所有客户交易。

现在,我有另一个项目请求,他们希望将客户事务插入到同一数据库中的不同模式中。我认为与其创建其他服务,我可以增强此服务,因为基础数据库是相同的,而且是关于客户交易的。

所以,我在我的服务接口createCustomerTransactions 中创建了另一个方法,我想将它命名为与我的 GET 请求相同的名称,但这个方法将是 POST,如下所示:

发布http://localhost:8080/my-project/customers/transactions

我使用 Soap-UI 对此进行了测试,它可以正常工作。我的问题是它是做 Restful 的正确方法。 GET 和 POST 是否可以在内部使用相同的 url,尽管它们将指向不同的实际方法? 我不擅长名字,所以不能为资源想出另一个更好的名字。

【问题讨论】:

【参考方案1】:

TL;DR 是的,你可以,这实际上是一个很好的做法。

原因如下:

当与 HTTP 一起使用时,Restful 取决于资源(URL)并依赖于 HTTP 动词的操作,这是常见且良好的做法,使用此动词来识别对您拥有的资源的一些操作:

GET 检索所有或仅检索一个资源。

POST 通常用于创建新资源。

PUT 用于更新资源

DELETE 删除资源

在启动我们的 Restful API 之前,我们应该做的首要任务之一是确定我们需要拥有哪些资源以及它们的属性。这种方法的第一条规则是使用名词而不是动词,例如 person、ticket、customer 等。

定义资源后,您需要确定适用于它们的操作以及这些操作将如何映射到您的 API。 RESTful 原则提供了使用如下映射的 HTTP 方法处理 CRUD 操作的策略。

GET /tickets - 检索门票列表

GET /tickets/12 - 检索特定票

POST /tickets - 创建一个新票

PUT /tickets/12 - 更新票证 #12

PATCH /tickets/12 - 部分更新票证 #12

DELETE /tickets/12 - 删除票证 #12

以上内容取决于防火墙配置,但请将以上内容视为 API 设计原则的建议。

【讨论】:

感谢您抽出宝贵时间,但您能否就我所描述的场景对我的实际问题发表评论。从您的 GET /tickets 和 POST /tickets 样本来看,我似乎走在了正确的轨道上。你同意吗?【参考方案2】:

是的,你可以。事实上,这是 RESTful 设计的核心基础之一。它不像 crud/RPC 那样,即 createTransaction 或 fetchTransaction。 HTTP 动词用于指定对资源的操作。

【讨论】:

以上是关于是否可以对 get 和 post rest api 使用相同的资源名称的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在 Django Rest Framework 中的另一个 API 方法中调用 API POST 方法

在restful api 设计中,如果要获得一个资源,一定要用GET方法么

WP Rest API 自定义端点在 GET 和 POST 上返回 false

向我的 RESTful API(Python-Flask)发送 POST 请求,但收到 GET 请求

koa2 get post api restful前端联调

typescript Angular HTTP Rest API GET,POST,PUT,DELETE