浅析HTTP协议请求报文: post和get方法

很多人在学习web知识的时候容易产生一种惯性思维,那就是觉得get方法就是从服务器取得数据;post方法就是向服务器提交数据。造成这种思维的原因,大概就是我们在学习面向对象编程的时候学过类的get()方法和set()方法,容易把这种概念类比到HTTP协议的概念里面。哪怕是我身边有一定工作经验的程序员都有可能产生这种思维。

HTTP协议是运行在计算机网络应用层的网络协议。它由两个程序实现,一个是服务器,一个是客户端。一个网站要想能够被访问,必须要用一个服务器来存储所有相关的图片,文档,程序等等的数据。这个服务器可能就是在一个机器上面运行的THHP server程序,例如tomcat, nginx等等。浏览器就是我们使用的客户端,我们在浏览器的地址栏输入支持http协议的web服务器ip地址或者域名,端口号,还有路径,就可以访问web server上面的网页了。

HTTP协议约束了 web server 和 client 之间如何通信。它们通过发送报文,进行通信。客户端向服务器发送请求报文,服务器收到请求报文后根据客户端的请求,发送一个响应报文。此文着重讲解一下 post 和 get 方法之间的区别和联系。

一个 request 报文可能是这样:

POST /path/of/resource HTTP/1.1
Host: IP:PORT
Authorization: Basic YXBpdXNlcjpmbnN0MTIzNA==
User-Agent: curl/7.59.0
Accept: /
Content-Length: 31
Content-Type: application/x-www-form-urlencoded

我们看到的第一行,就是报文的请求行 。POST 表示这次http请求的方法是post方法。 然后是路径, http协议。
请求方法可以是以下几种:get post put delete head 。post会将参数保存在body中,而get方法不会。
如果发送一个携带参数的get 请求,我们的参数会体现在url中。
用curl发送一个get请求:curl -v -X GET -i "http://ip:port/path?aaa=1&bbb=44d"
请求报文如下,参数在path中:

GET /path?aaa=1&bbb=44d HTTP/1.1
Host: 10.167.157.49:5001
Authorization: Basic YXBpdXNlcjpmbnN0MTIzNA==
User-Agent: curl/7.59.0
Accept: /

  • HTTP 1.0, assume close after body

如果发送一个携带参数的post请求,我们的参数不会体现在url中,
用curl请求的命令:curl -v -X POST -d "aaa=1&bbb=44d" -i http://ip:port/path
我们的参数会被存在request报文的body中:

POST /path HTTP/1.1
Host: 10.167.157.49:5001
Authorization: Basic YXBpdXNlcjpmbnN0MTIzNA==
User-Agent: curl/7.59.0
Accept: /
Content-Length: 31
Content-Type: application/x-www-form-urlencoded

  • upload completely sent off: 31 out of 31 bytes
  • HTTP 1.0, assume close after body

从上面的request报文可以看到,上传了body。

以上,我们可以看出http 请求一个网页的时候,post方法和get方法都可以向服务器提交表单。但是我们一般看到的都是用post方法,只是为了保护表单中数据的私密性,为了不让用户的输入暴露在url中。其实get方法也可以提交表单,不过表单的输入都体现在了url里而已。

猜你喜欢

转载自blog.csdn.net/njnujuly/article/details/80513724