put和post
1. 有啥区别?
put和post的技术实现上没有很大区别,区别主要体现在协议语义上。
2. 为什么遵守?
如果只有语义上的区别,那么不遵守有什么问题呢?
规范带来的好处是很多的,就像是开发人员的语言一样,当大家遵守同样的规范,沟通才更容易,不至于导致出现问题。公司内部还行,但是如果牵涉到外部工具或者其他公司开发合作,那还是会有问题的。举个比较严重的例子。chrome浏览器为了加快页面加载,会在页面预加载某些GET链接(跳转链接,非资源链接),这样用户点那个链接时,加载速度就很快。有一个图片网站,使用GET请求,参数里面有个OPT用来表示动作。用户打开页面时,嵌入了OPT=“DEL”的链接在图片附近的表单中,然后就被Chrome删除了。再举个其他可能接触的例子。公司可能使用工具解析client请求,来分析请求的分布等信息。如果client的User-Agent字段没有遵守协议标准,那么工具将无法正确统计,这样的例子很多。标准的存在意义就是为了统一概念,这样即使从未见面的人,各个国家不同语种的人,甚至火星人也能轻松交流。
3. 什么区别?
HTTP协议使用的是URI,是一种资源标志,那么对应的HTTP Verb就是各种对资源的操作,GET,PUT,DELETE等,明确这些,再往下看。
3.1PUT
client对一个URI发送一个Entity,服务器在这个URI下如果已经有了一个Entity,那么此刻服务器应该替换成client重新提交的,也由此保证了PUT的幂等性。如果服务器之前没有Entity ,那么服务器就应该将client提交的放在这个URI上。总结一个字:PUT,PUT的方法就是其字面表意,将client的资源放在请求URI上。对于服务器到底是创建还是更新,由服务器返回的HTTP Code来区别。注:通过上面可以知道,如果用PUT来达到更改资源,需要client提交资源全部信息,如果只有部分信息,不应该使用PUT(因为服务器使用client提交的对象整体替换服务器的资源)。
3.2 POST
这个Verb是比较特殊。不同于一般的增删改,使用场景比较多。根据RFC文档上描述,有以下几个场景:对现有资源的注解;向公告板、邮件群组、文章群组中提交消息;提交一个数据块(就像表单提交的结果),到数据处理过程;通过附加操作扩展数据库。
因为服务器实现POST是不可预知,所以将其定义为不安全、不幂等的Verb。基本上不能方便的归纳为“增删改”之类的行为,都可以使用POST方法;另外可以使用POST去实现“部分更新资源”。