我目前正在Laravel中开发一个应用程序。在尝试遵守REST API准则时,我遇到了一种不确定如何完全处理REST的情况。
我有一个可以处理多个动作的租赁资源:
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');
还有两个独立功能中的控制逻辑,尽管它们实际上只是额外的存储和更新,虽然有些多余,但是会有些多余吗?
答案 0 :(得分:0)
您似乎正在尝试将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。