Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 对Http动词感到困惑_Wcf_Http_Rest_Wcf Rest_Httpverbs - Fatal编程技术网

Wcf 对Http动词感到困惑

Wcf 对Http动词感到困惑,wcf,http,rest,wcf-rest,httpverbs,Wcf,Http,Rest,Wcf Rest,Httpverbs,我搞不懂在REST中何时以及为什么要使用特定的动词 我知道一些基本的事情,比如: Get -> for retrieval Post -> adding new entity PUT -> updating Delete -> for deleting 这些属性将按照我上面写的操作使用,但我不明白为什么? 如果REST中的inside Get方法添加了一个新实体或inside POST更新了一个实体,会发生什么?或者可以在内部删除我添加的实体。我知道这可能是一个noob

我搞不懂在REST中何时以及为什么要使用特定的动词

我知道一些基本的事情,比如:

Get -> for retrieval
Post -> adding new entity
PUT -> updating
Delete -> for deleting
这些属性将按照我上面写的操作使用,但我不明白为什么?
如果REST中的inside Get方法添加了一个新实体或inside POST更新了一个实体,会发生什么?或者可以在内部删除我添加的实体。我知道这可能是一个noob问题,但我需要理解它。这听起来让我很困惑。

如果你这样做,你不能声称你的界面是RESTful的。REST原则要求指定的谓词执行您提到的操作。如果没有,则不能将其称为RESTful接口。

协议就是协议。它旨在定义与之相关的每一条规则。Http也是一种协议。以上所有规则(包括http动词规则)都是由http协议定义的,用法是由http协议定义的。如果您不遵守这些规则,只有您才能理解服务内部发生了什么。它不会遵循协议的规则,并且会让其他用户感到困惑。有一次,有一个关于著名的照片网站(不管是哪个)的例子,它使用GET请求删除了照片。一旦该网站的用户安装了谷歌桌面搜索程序,该程序就会在本地归档页面。由于该程序知道GET操作仅用于获取数据,不应影响任何内容,因此它向每个可用url(包括GET delete url)发出GET请求。由于用户已登录且cookie位于浏览器中,因此不存在授权问题。结果——由于http协议和GET动词的使用不正确,服务器上的所有用户照片都被删除。这就是为什么你应该始终遵循你使用的协议规则。尽管技术上可行,但覆盖已定义的规则是不对的。

使用GET删除资源就像拥有一个命名和记录的函数,向数组中添加一些内容,从引擎盖下的数组中删除一些内容。REST只有几个定义良好的方法(HTTP谓词)。您服务的用户会希望您的服务遵守这些定义,否则它就不是RESTful web服务。

错误使用动词的陷阱,但我要指出的是,规则并不像您描述的那样严格(至少就协议而言)

  • 一定要安全。这意味着GET请求不能以任何实质性的方式更改服务器状态。(服务器可以做一些额外的工作,如记录请求,但不会更新任何数据。)
  • PUT和DELETE必须是幂等的。这意味着对同一URI的多个调用将具有与一个调用相同的效果。例如,如果你想把一个人的名字从“Jon”改为“Jack”,你可以用PUT请求,因为你可以做一次或100次,而这个人的名字仍然会被更新为“Jack”
  • POST不保证安全性或幂等性。这意味着你可以通过POST请求技术上做任何你想做的事情。但是,您将失去客户可以利用这些假设的任何优势。例如,您可以使用POST进行搜索,这在语义上更像GET请求。这不会有任何问题,但浏览器(或代理或其他代理)永远不会缓存该搜索的结果,因为它不能假定请求不会导致任何更改。此外,网络爬虫永远不会执行POST请求,因为它不能假定操作是安全的
万维网的整个HTML版本在没有PUT或DELETE的情况下运行得很好,使用POST进行删除或更新也很好,但是如果您可以支持更新和删除的PUT和DELETE(以及其他幂等操作),则会更好一些,因为代理可以假定该操作是幂等的


有关安全性和幂等性的真正本质,请参阅。

如果你这样做,其他警察会来敲你的门,让你阅读罗伊·菲尔丁的博士论文,而不仅仅是关于休息的章节。杰瑞克:接受你的答案,因为它能更好地解释动词。谢谢你,杰里克斯