发现很多面试题都会问道Get和Post的区别,今天来了兴致,好好地研究一下。Get和Post的区别在网上可以搜到很多,首先看一下基本的定义:
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。Post比Get的安全性高。实质上,GET和POST只是发送机制不同,并不是一个取一个发!
为了能看到具体的Get和Post方法,发送的数据。我们模拟一下Get和Post的过程。因为Http是基于Tcp实现的,所以我们使用底层的Socket模拟一个Http服务器。我们将获得的Get或者Post发送过来的请求消息,打印出来。
ServerSocket serverSocket=new ServerSocket(8802);
Socket client=serverSocket.accept();
InputStreamReader in=new InputStreamReader(client.getInputStream());
while(true){
System.out.print((char)in.read());
}
我们写一个html模拟客户端,
get方式的:
<form method="get" action="http://10.13.30.160:8802">
name:<input type="text" name="name" /><br>
age:<input type="text" name="age" /><br>
<input type="submit" />
</form>
post方式的:
<form method="post" action="http://10.13.30.160:8802">
name:<input type="text" name="name" /><br>
age:<input type="text" name="age" /><br>
<input type="submit" />
</form>
保存为.html文件之后,分别打开。服务器会打印出具体消息:
get方式的:
GET /?name=wjy&age=24 HTTP/1.1
Host: 10.13.30.160:8802
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 BIDUBrowser/2.x Safari/537.31
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: iso-8859-1,*,utf-8
post方式的:
POST / HTTP/1.1
Host: 10.13.30.160:8802
Connection: keep-alive
Content-Length: 15
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 BIDUBrowser/2.x Safari/537.31
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: iso-8859-1,*,utf-8
name=wjy&age=24
我们通过对比可以发现:Get和Post在请求中的参数的位置不同。
HTTP请求一般包含以下部分:
1:Request-Line
2:Header
3:<空行>
Message-Body[GET请求不包含Message-Body]
其中Request-Line包含三个部分:
Method(GET/POST/其他)、Request-URI、HTTP-Version,三个部分由空格隔开。
所以可以知道,GET请求的参数在Request-Line的Request-URI中,而POST请求的参数在请求主体Message-Body中。