一、Get和Post的区别
Get的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片和视频等。
他的参数一般位于URL中,URL规定只能支持ASCII,所以Get字符只允许ASCII字符。
Post的语义是根据请求负荷(报文body)对指定的资源做出处理,具体处理方式视资源类型不同。
Post请求携带数据的位置一般是写在报文body中,body中的数据可以任意格式的数据,只要客户端和服务器端协商好,且不会做出大小限制。
二、安全和等幂的概念
安全:指请求方法不会破坏服务器的资源;
等幂:多次执行相同的操作,结果都是相同的。
从这个角度看,
Get方法都是安全且等幂的,因为Get是只读操作,无论操作多少次,服务器的数据都是安全的,且结果不会有变化。
所以可对Get请求的数据做缓存,这个缓存可以做到浏览器本身,也可以做到代理服务器上,浏览器中Get请求可以保存为书签。
Post是**【新增或提交数据】的操作,会修改服务器资源, 所以是不安全的**,且多次提交会创建多个资源,所以不是等幂的。
so,浏览器不会缓存Post的请求,也不能把Post请求保存为书签。
Get请求示例:
请求行:
GET /search/users?q=JakeWharton HTTP/1.1
URL为 /search/users?q=JakeWharton
,协议为HTTP1.1。
请求行下面均为请求头部,可以看到host为api.github.com
,连接方式为长连接。
该例子是不存在请求数据的。
Post请求示例:
Post请求中,URL为空,协议版本为HTTP1.1.
与Get不同在于,它的请求参数是位于数据中的,可以看到name=Professional%20Ajax&publisher=Wiley
就是它的请求数据,且请求数据和请求头部之间需要空出一行。
对于 GET 和 POST 的区别,总结来说就是:它们的本质都是 TCP 链接,并无区别。但是由于 HTTP 的规定以及浏览器/服务器的限制,导致它们在应用过程中可能会有所不同。
小结:
GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可被缓存的。
POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。
这些概念都是从RFC规范定义的语义来分析的。
实际过程中,可以用Get来实现新增或修改数据的请求,也可以用Post实现查询数据的请求。
而且安全如果放入概念是信息不会被泄露,那Get请求在URL中传输,而Post在body中传输,明显URL中更容易被看到数据,所以并不能说Get一定比Post安全。
想要避免传输过程数据不被窃取,就要使用HTTPS协议,这样的HTTP数据会被加密传输。
问题1:GET 请求可以带 body 吗?
答:RFC 规范并没有规定 GET 请求不能带 body 的。理论上,任何请求都可以带 body 的。只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。
另外,URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数的。