处理多个动作的 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章
AngularJs调用Restful实现CRUD - AngularJs
Backbone UI 和 CMS 后端:涉足 Restful CRUD