【面试】Restful动词中post,patch,put的区别?什么是安全?什么是幂等?哪些动词符合安全幂等?

HTTP协议本身是一种面向资源的应用层协议,但对HTTP协议的使用实际上存在着两种不同的方式:一种是RESTful的,它把HTTP当成应用层协议,比较忠实地遵守了HTTP协议的各种规定;另一种是SOA的,它并没有完全把HTTP当成应用层协议,而是把HTTP协议作为了传输层协议,然后在HTTP之上建立了自己的应用层协议。本文所讨论的HTTP幂等性主要针对RESTful风格的,不过正如上一节所看到的那样,幂等性并不属于特定的协议,它是分布式系统的一种特性;所以,不论是SOA还是RESTful的Web API设计都应该考虑幂等性。

安全: 请求是否会给服务器带来副作用,即该操作用于获取信息而非修改信息。如get是安全的,而post不安全
幂等: 不管进行多少次操作,结果都一样

 方法名安全性幂等性说明
创建于更新POST创建子资源
PUT用于创建、更新资源;
PATCH与PUT类似,用于创建、更新资源,区别在于PATCH代表部分更新
删除DELETE删除资源
获取GET用于获取资源
HEAD与GET方法类似,但不返回message body内容,仅仅是获得获取资源的部分信息(content-type、content-length)
 OPTIONS用于url验证,验证接口服务是否正常;
 TRACE回显服务器收到的请求,这样客户端可以看到(如果有)哪一些改变或者添加已经被中间服务器实现。

GET和HEAD既安全又幂等,POST和PATCH既不安全又不幂等,PUT和DELETE不安全但是幂等

详细用法如下:

POST /users: 创建一个新用户
PATCH /users/123 and PUT /users/123: 更新用户123
DELETE /users/123: 删除用户123
GET /users: 逐页列出所有用户
GET /users/123: 返回用户 123 的详细信息
HEAD /users: 显示用户列表的概要信息
HEAD /users/123: 显示用户 123 的概述信息
OPTIONS /users: 显示关于末端 /users 支持的动词
OPTIONS /users/123: 显示有关末端 /users/123 支持的动词

HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。
HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.com/article/4231,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。
POST和PUT的区别容易被简单地误认为“POST表示创建资源,PUT表示更新资源.但实际上两者都可以用来创建或是更新数据.单从技术上来说,他们并没有什么区别.但是在HTTP规范中POST是非等幂的,多次调用会产生不同的结果,比如:创建一个用户,由于网络原因或是其他原因多创建了几次,那么将会有多个用户被创建.而PUT id/456则会创建一个id为456的用户,多次调用还是会创建的结果是一样的,所以PUT是等幂的.
PATCH一般是用来局部更新资源的,假设我们有一个UserInfo,里面有userId, userName, userGender等10个字段。可你的编辑功能因为需求,在某个特别的页面里只能修改userName,这时候的更新怎么做?
人们通常(为徒省事)把一个包含了修改后userName的完整userInfo对象传给后端,做完整更新。但仔细想想,这种做法感觉有点二,而且真心浪费带宽(纯技术上讲,你不关心带宽那是你土豪)。
于是PATCH诞生,只传一个userName到指定资源去,表示该请求是一个局部更新,后端仅更新接收到的字段。
而PUT虽然也是更新资源,但要求前端提供的一定是一个完整的资源对象,理论上说,如果你用了PUT,但却没有提供完整的UserInfo,那么缺了的那些字段应该被清空.另外PUT会有一个create操作,加入更新的id不存在,会进行创建,而PATCH则没有这个.

问:如何理解HTTP PATCH是非幂等的?
PATCH定义中有句话:如果URI对应的资源不存在,服务端可以创建一个新资源。

问:GET与提交的长度限制?

GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值