为什么我们需要在REST(完整)web服务中放置和删除


why we need put and delete in REST(full) web service?

我可以调用这样的web服务吗并且不使用put和delete方法?这真的是REST web服务吗?

....
$url = 'webservice.php';
$data = array(
    'username' => 'a',
    'password' => 'a',
    'param1'=> 'param1',
    'operation'=> 'delete',
    'output'=>'xml'
);
$client = curl_init($url);
curl_setopt($client, CURLOPT_POST,1);
....

//webservice.php
$operation=$_POST['operation'];
$param1=$_POST['param1'];
if ($operation=='delete')
{
$r=mysql("delete from list where id='$param1'");
}
if ($operation=='insert')
{
$r=mysql("insert into  list values ('$param1')");
}
.....

REST背后的主要思想之一是不将操作方法作为参数的一部分(在本例中为"operation"参数)。

相反,每个资源都有其唯一的URL,并且在这些资源上使用HTTP谓词(GET、POST、PUT或DELETE)。

您的方法不是RESTful。

示例:

使用flickr API删除注释:

GET /services/rest/?method=flickr.photos.comments.deleteComment&comment_id=28

请注意它们是如何使用"method"参数来确定要执行的操作的(就像您的示例中一样)。

RESTful实现将接受以下内容:

DELETE /comment/28

这种情况下的最佳实践是使用POST创建新资源,使用DELETE删除资源,使用GET检索现有资源,使用PUT更新现有资源。

这种技术有时被称为"隧道",因为它将真正的操作隐藏在通用POST操作的主体中。在我看来,这是一种黑客攻击,违背了REST的目的,但有时如果你的网络主机不允许所需的HTTP动词,这是必要的。

使用标准动词并理解它们对服务的影响是REST的一个重要方面,不应被忽视。例如,您应该能够在同一资源上重复发出DELETE操作,这应该只导致第一个DELETE具有任何效果(幂等)。使用GET时,应该假设服务器上没有进行任何更改(安全)。但是将操作隐藏在POST中会掩盖这一点。

这并不是一个真正的RESTful服务。您不需要实现所有的HTTP谓词来实现RESTful,但不应该使用POST来删除数据。

就我个人而言,我会实现DELETE来删除项目,而只使用POST来插入数据。

我要在这里逆流而上,说在没有PUT和DELETE的情况下创建RESTful服务是完全可以的。你需要意识到的唯一关键是你在这样做的过程中放弃了什么

1) 中介组件(例如代理、缓存、负载均衡器)将不知道您是在创建/更新还是删除资源,它们只知道操作是安全的(GET)还是不安全的(POST)。我的问题是,你知道有哪些中间组件利用了这些知识吗?

2) 要访问您的服务的程序员将无法猜测如何删除资源,您必须包含一个具有链接关系的链接,该链接具有一些文档,向程序员解释他们需要POST到链接的URI才能进行删除。对于客户端开发人员来说,这是一项更多的工作,但至少你已经明确了如何做到这一点

在我被否决而被遗忘之前,这里引用了罗伊·菲尔丁的一句话,他说这也没关系!

无论如何,有很多除了获取并发布。关键是使用的是方法,而不是什么方法习惯于举一个具体的例子使wiki或多或少具有RESTful几乎总是由它的方式决定(ab)使用GET和会话——无论它使用PUT或POST编辑页面相比之下,是糖浇头。

http://code.google.com/p/implementing-rest/wiki/FAQ

话虽如此,从REST的角度来看,创建一个名为webservice.php的资源并传递一个"操作"参数是一种令人讨厌的设计气味。