首先,一些定义:
PUT在第9.6节RFC 2616中定义:
PUT方法请求将所包含的实体存储在提供的Request-URI下.如果Request-URI引用已经存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本.如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源.
PATCH在RFC 5789中定义:
PATCH方法请求将请求实体中描述的一组更改应用于Request-URI标识的资源.
另外根据RFC 2616第9.1.2节, PUT是幂等的,而PATCH则不是.
现在让我们来看一个真实的例子.当我/users使用数据进行POST {username: 'skwee357', email: 'skwee357@domain.com'}并且服务器能够创建资源时,它将响应201和资源位置(假设/users/1),并且/users/1将返回对GET的任何下一次调用{id: 1, username: 'skwee357', email: 'skwee357@domain.com'}.
现在假设我要修改我的电子邮件.电子邮件修改被视为"一组更改",因此我应该修补/users/1 " 补丁文档 ".在我的情况下,它将是一个json {email: 'skwee357@newdomain.com'}.然后服务器返回200(假设权限正常).这让我想到第一个问题:
PATCH是一个相对较新的动词(2010年3月引入的RFC),它解决了"修补"或修改一组字段的问题.在引入PATCH之前,每个人都使用PUT来更新资源.但是在引入PATCH之后,让我感到困惑的是当时使用的PUT是什么?这让我想到了第二个(也是主要的)问题:
/users替换整个集合.在引入PATCH之后,在特定实体上发布PUT是没有意义的.我错了吗?我最近才参与PHP/AJAX/jQuery,在我看来,这些技术的一个重要部分就是POST和GET.
首先,POST和之间有什么区别GET?通过实验,我知道GET将返回的变量及其值附加到URL字符串
website.com/directory/index.php?name=YourName&bday=YourBday
Run Code Online (Sandbox Code Playgroud)
但POST不是.
那么,这是唯一的区别还是有特定的规则或惯例使用其中一个?
其次,我也看到POST和GETPHP之外:还AJAX和jQuery.这3个怎么做POST和GET不同?它们是相同的想法,相同的功能,只是采用不同的方式?
我想用以下场景的适当方法设计我的休息端点.
有一个小组.每个组都有一个状态.管理员可以激活或取消激活该组.
我应该将我的终点设计为
PUT /groups/api/v1/groups/{group id}/status/activate
Run Code Online (Sandbox Code Playgroud)
要么
PATCH /groups/api/v1/groups/{group id}
with request body like
{action:activate|deactivate}
Run Code Online (Sandbox Code Playgroud) 使用GET或POST方法有什么区别?哪一个更安全?他们每个人的(dis)优势是什么?
(类似问题)
在RESTful样式编程中,我们应该使用HTTP方法作为构建块.虽然哪种方法与经典的CRUD方法相匹配,但我有点困惑.GET/Read和DELETE/Delete非常明显.
但是,PUT/POST有什么区别?它们是否与"创建和更新"一对一匹配?
Curl提供了一系列不同的http方法调用,它们以X为前缀,但也提供了相同的方法.我已经试过了两个,我似乎无法找出差异.有人可以快速向我解释这两种操作有何不同?
虽然HTTP 1.1规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义.
4.3消息正文
服务器应该在任何请求上读取和转发消息体; 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息主体.
我已经回顾了有关SO及其他内容的几个相关讨论,例如:
大多数讨论似乎都同意允许在DELETE上提供消息体,但通常不建议这样做.
此外,我注意到各种HTTP客户端库中的趋势,这些库中似乎记录了越来越多的增强功能,以支持DELETE上的请求主体.大多数图书馆似乎都有责任,尽管偶尔会有一些初步阻力.
我的用例要求在DELETE上添加一些必需的元数据(例如删除的"原因",以及删除所需的一些其他元数据).我已经考虑了以下选项,其中任何一个看起来都不合适,并且与HTTP规范和/或REST最佳实践内联:
POST /resourceToDelete { deletemetadata })POST不是删除的语义选项; POST实际上代表了所需的相反操作(即POST创建资源下属;但我需要删除资源)我的第一个偏好可能是使用消息体,第二个是自定义HTTP头; 但是,如上所述,这些方法存在一些缺点.
是否有任何与REST/HTTP标准一致的建议或最佳实践,以便在DELETE请求中包含此类必需的元数据?还有其他我没有考虑的替代方案吗?
我想知道在执行登录请求时我应该使用哪种http方法,为什么?由于此请求在服务器上创建了一个对象(用户会话),我认为它应该是POST,你怎么看?但由于登录请求应该是幂等的,它可能是PUT,不是吗?
对于注销请求,我应该使用DELETE方法吗?
HTTP上的Wikipedia条目列出了以下HTTP请求方法:
我有兴趣了解(特别是关于前五种方法):
我很欣赏所有的输入,如果你能分享一些(最好是轻的)阅读,那也很棒!
我正在开发REST WCF服务,理论上我知道何时选择什么目的.
GET 获得资源PUT 更新POST 插入DELETE 删除但是,如果我们不遵循上述规则,假设插入一个我使用过的GET方法的记录,有什么不利之处呢?
http-method ×10
http ×7
rest ×6
get ×2
post ×2
.net ×1
crud ×1
curl ×1
forms ×1
http-patch ×1
http-put ×1
httprequest ×1
json ×1
login ×1
logout ×1
payload ×1
put ×1
request ×1
wcf ×1
web-services ×1