我没有看到PUT和DELETE http动词背后的目的。我在https://scotch.io/tutorials/simple-laravel-crud-with-resource-controllers看到了一个教程,并且在基于数据库的应用程序中没有看到PUT或DELETE方法的强大功能。当我在应用程序中将完全相同的代码粘贴到POST路由中时,为什么我还懒得在我的应用程序中编写PUT路由?
答案 0 :(得分:3)
没有特定的权力使用一个在另一个上面,这里的好处主要是语义上的。
虽然没有强制执行REST约定,但这些约定用于提供标准化的"访问RESTful资源的方式(尽管接受的规范可能因人而异)。
RESTful Web服务使用的HTTP方法(动词)由RFC2616定义。根据该定义,动词确实具有一些固有的语义价值:
根据定义,
PUT
和DELETE
方法是幂等的(意味着每次运行时使用该方法的特定请求的结果都是相同的),而POST
请求另一方面则不是。
考虑一下Laravel的Route::resource()
方法生成的一些路线:
+--------+---------------------+------------------+-------------------------------+
| Method | URI | Name | Action |
+--------+---------------------+------------------+-------------------------------+
| POST | resource | resource.store | ResourceController@store |
| GET | resource/{resource} | resource.show | ResourceController@show |
| PUT | resource/{resource} | resource.update | ResourceController@update |
| DELETE | resource/{resource} | resource.destroy | ResourceController@destroy |
+--------+---------------------+------------------+-------------------------------+
使用POST
方法的路由将创建一个新的资源条目,因此它不需要在路由中指定唯一标识符,但是如果查看其他三个定义,您可以看到使用特定的语义值在同一资源上发出请求的方法。所以如果你要求:
http://domain.com/resource/1
根据HTTP方法,请求会执行不同的操作:
GET
将返回ID为1
PUT
将修改/更新ID为1
DELETE
将销毁ID为1
这意味着无论您的资源是小狗,汽车还是文档,您都知道在同一网址上使用不同的动词会产生预期效果。
这不是您需要编码的标准,它只是很多人都同意的事情。由于Laravel在某些方面是一个自以为是的框架,它提供了开箱即用的资源处理方式。
当然没有什么可以阻止你对所有路由使用POST
,因为它可以正常工作(你需要为每个动作使用不同的URL路径,但最终结果是会是一样的。)