GET和POST的区别
标准答案(W3school):对于大多数浏览器是存在的,因为他们实现了HTTP协议
由上可见,get和post的基本区别可以总结如下:
GET请求用于获取数据,无副作用,幂等,且可缓存;
POST请求用于修改数据,有副作用,非幂等,不可缓存。
名称解释:
http请求:
HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议),是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
幂等性:
从定义上看,HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。而实际上,幂等性是分布式系统设计中一个十分重要的概念。
副作用:
get请求在进行回退和刷新页面操作时,不会对数据产生影响,是无害的;
post请求在刷新页面时,会重复提交数据,导致远端服务器重复创建出了资源。
解决办法:对于电商项目来说,可以通过**1、**对应的后台WebService一定要做到幂等性;**2、**服务器端收到post请求,在操作成功后,必须302跳转到另一个页面,这样即使用户刷新页面,也不会重复提交表单。
get和post报文上的区别
get 和 post请求都是HTTP协议中的两种请求方式,而http协议是一种基于TCP/IP的应用层协议,get和post都是同一个传输层协议,所以在传输上,没有区别。
在报文格式上,不带参数的情况下,只有第一行的方法名不同,一个GET, 一个POST;
带参数的情况下,在约定中,GET请求将参数放置在url
中,在?
后面拼接数据,数据之间用&
隔开;
POST请求则是将数据封装到body
中;
简单实例:
name=zs age=23
GET请求报文:
GET /index.html?name=zs&age=23
Host:localhost
POST请求报文:
POST /index.html
Host:localhost
Content-Type:application/x-www-form-urlencoded
name=zs&age=23
由于它们本质上都是TCP连接,所以,如果我们不遵守约定,也是可以的。
GET请求url参数写法是固定的吗?
不固定
一般而言,在约定中,通常是在?
后面拼接数据,数据之间用&
隔开;
但解析报文的过程是通过获取TCP数据,然后通过正则等工具从数据中获取Header和Body,从而提取参数的。
故我们可以自己约定参数的写法,只要最终服务端能够解释出来就行,一种比较流行的写法是http://www.mryang.com/name/zs/age/23
POST方法比GET方法安全?
POST方法安全是相对与GET请求而言的,因为GET请求的参数在地址栏是可见得。
但严格意义上来说,两种请求都是不安全的,因为HTTP在网络上是明文传输,只要通过网络节点抓包,就可以获取完整的数据报文。
想要安全的传输,就只有加密,即使用HTTPS。
GET方法的参数长度是有限的?
HTTP协议本身是没有限制body和url的长度的,而URL限制大多数是浏览器 和 服务器端自己限制的
浏览器的原因暂且不谈,就服务器而言,处理URL是需要耗费较多资源的,为了性能和安全(防止恶意构造长URL来攻击)考虑,会给URL长度加以限制。
POST方法会产生两个数据包?
此说法是错误的,不仅HTTP协议中没有明确说明POST请求会产生两个数据包,在实际测试(chrome)中发现,Header和body并不会分开发送。
在许多文章中都会提到,POST请求会将Header和Body分开发送,先发送Header,服务器端返回状态码100后,在发送Body。而经过实际测验,并非如此。
所以Header和Body分开发送是部分浏览器和框架的请求方式,并非POST请求的必然行为。