处理多个动作的 RESTful CRUD 函数?

Posted

技术标签:

【中文标题】处理多个动作的 RESTful CRUD 函数?【英文标题】:RESTful CRUD functions which handle multiple actions? 【发布时间】:2019-07-11 09:18:14 【问题描述】:

我目前正在 Laravel 中开发一个应用程序。在尝试遵守 REST API 指南时,我遇到了一个我不确定如何以 RESTfully 方式处理的场景。

我有一个可以处理多个操作的 Lease 资源:

Route::get('/lease/create', 'API\LeaseController@create');
Route::get('/lease/leaseId', 'API\LeaseController@show');
Route::post('/lease', 'API\LeaseController@store');
Route::patch('/lease/leaseId', 'API\LeaseController@update');
Route::delete('/lease/leaseId', 'API\LeaseController@destroy');

到目前为止,这些是 URI 和控制器操作之间的 1:1。现在,我需要在租约上执行其他操作,这就是我不确定处理此问题的最佳方法的地方。

1) 可以续订租约(使用新的开始和结束日期克隆现有租约)。

2) 可以结束租约(状态更改为非活动,结束日期已更新)。

当我考虑以 REST 方式执行此操作时,我将这两个附加操作视为对现有端点的发布和补丁(两者都将映射到控制器上的 store 和 update 方法,并且可以使用现有的 URI。

我是否应该继续这样考虑并将它们都映射到现有端点?我担心的是我将如何处理不同的反应?例如,如果在续订操作完成后,我想传递一条消息说“此租约已成功续订。”,我如何区分续订操作和常规商店操作,因为它们都达到了相同的终点?

或者我应该创建两个新的 URI,比如:

Route::patch('/lease/leaseId/end', 'API\LeaseController@updateLeaseEnd');
Route::post('/lease/leaseId/renew', 'API\LeaseController@storeLeaseRenew');

还有两个独立函数中的控制逻辑,尽管它们实际上只是额外的存储和更新,这有点多余?

【问题讨论】:

我会选择具有不同处理程序的其他路线。因为您将为每个场景提供一个完全可测试的应用程序。 【参考方案1】:

您似乎正在尝试将 RPC 风格的 API 融入 RESTful 风格的 API,这是可能的,但可能会造成混淆。您可以像您所说的那样使用 PATCH 方法,但现在您有一个应该只进行部分更新的重载方法,但现在它可能对资源执行操作。那会令人困惑。

我见过的一种方法是在 URI 中使用所谓的动词(不要被“HTTP 动词”混淆)。这基本上就是您在问题中作为最后一个选项所说的内容。

结构

https://api.domain.com/namespace/resource/_verb
https://api.domain.com/namespace/resource/id/_verb

例子

https://api.domain.com/namespace/lease/id/_end
https://api.domain.com/namespace/lease/id/_renew

下划线表示这不是资源,而是执行调用。

另一种选择是将 REST API 与 RPC API 分开。您可以使用传统的 SOAP Web 服务,也可以使用 Google 提供的新 gRPC。

【讨论】:

以上是关于处理多个动作的 RESTful CRUD 函数?的主要内容,如果未能解决你的问题,请参考以下文章

命名 RESTful 路径

AngularJs调用Restful实现CRUD - AngularJs

Backbone UI 和 CMS 后端:涉足 Restful CRUD

RESTful Crud MEAN.js 路由

无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接口

Axios学习