网络编程——Http请求方式Get与Post

请求报文

请求行 
请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,使用空格隔开。

常用的 HTTP 请求方法有 GET、POST。

GET

当客户端要从服务器中读取某个资源时,使用GET 方法。
GET 方法要求服务器将URL 定位的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。
使用GET方法时,请求参数和对应的值附加在 URL 后面,利用一个问号(“?”)代表URL 的结尾与请求参数的开始,传递参数长度受限制,因此GET方法不适合用于上传数据。
通过GET方法来获取网页时,参数会显示在浏览器地址栏上,因此保密性很差。

get请求报文例子:


GET / HTTP/1.1
Host: 192.168.110.10:9000
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive



POST

当客户端给服务器提供信息较多时可以使用POST 方法,POST 方法向服务器提交数据,
比如完成表单数据的提交,将数据提交给服务器处理。

GET 用于获取/查询资源信息。POST 附带用户数据,一般用于更新资源信息。
 

POST 方法将请求参数封装在HTTP 请求数据中,而且长度没有限制,因为POST携带的数据,在HTTP的请求正文中,以名称/值的形式出现,可以传输大量数据。


POST /search HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: http://www.baidu.cn
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host:www.baidu.com
Connection: Keep-Alive  
Cookie: PREF=ID=8tret43be9ae3c:U=treydfhgf5r4e65564td:NW=1:TM=5343434: hl=zh-CN&source=hp&q=domety 


请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

请求头    含义
User-Agent               请求的浏览器类型
Accept                      客户端可识别的响应内容类型列表,星号“ * ”用于按范围将类型分组,用“ / ”指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型
Accept-Language     客户端可接受的自然语言
Accept-Encoding      客户端可接受的编码压缩格式
Accept-Charset        可接受的应答的字符集
Host                         请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机
Connection              连接方式(close或keepalive)
Cookie                     存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie


空行 
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

请求包体 body
请求包体不在GET方法中使用,而是POST方法中使用。 
POST方法适用于需要客户填写表单的场合。与请求包体相关的最常使用的是包体类型Content-Type和包体长度Content-Length。

Get和Post的区别

GET请求的参数在URL里,通过URL传递,传送的参数是有长度限制的;而POST的参数不在URL里,参数放在放在Request body中,长度不受限制。

GET请求的参数直接暴露在URL上,所以不能用来传递敏感的参数信息,比如密码。

GET请求的URL,包括参数等信息,会被完整保留在浏览器历史记录里,而POST中的参数在body中不会被保留。

GET请求只能进行url编码,而POST支持多种编码方式。

GET请求会被浏览器主动cache,而POST不会,除非手动设置。

GET产生的URL地址可以被Bookmark,而POST不可以。

GET在浏览器回退时是无害的,而POST会再次提交请求。

GET和POST本质上没有区别

HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,GET/POST都是TCP连接。

GET和POST能做的事情是一样的。如果要给GET加上request body,给POST带上url参数,技术上是完全行的通的。 HTTP协议没有要求,POST的参数一定要放到请求体body里面,GET的参数就一定要放到URL里面。而是由各种浏览器软件的实现,变成了现在的现象,GET要用URL传参,POST用body传参。当然,可以给GET加上request body,给POST带上url参数,让人觉得不规范。虽然GET可以带request body,但不能保证一定能被服务器接收。不同服务器的处理方式是不同的,有些服务器会读出数据,有些服务器直接忽略。

HTTP规定,当发起GET请求的时候,要在请求头设置method为GET,而且要求把传送的数据放在url中,以方便记录。
发起POST请求,要在请求头设置method为POST。

请求头和请求体都没有长度的要求

HTTP协议明确了,请求头和请求体都没有长度的要求。

而对URL长度上的限制,是别的两个的原因造成的:

大多数浏览器会限制url长度在2K个字节,而大多数服务器最多处理64K大小的url。

1、浏览器

超过的部分不处理。据说IE对URL长度会限制在2048个字符内。但是就我所知,firefox是支持10W以上的长度。

2、服务器

服务器处理超长的URL,就是一种负担。

因此,多数服务器出于安全、稳定等多方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。

GET和POST的重大区别

GET产生一个TCP数据包;POST产生两个TCP数据包。

  • 对于Get请求,浏览器会把GET请求的header和data一起发送出去,服务器响应返回数据;
  • 对于POST请求, 浏览器先发送请求header,服务器响应100 continue,浏览器再发送请求data,服务器响应返回完整的数据。

实际上,在网络环境好的情况下,发一次包的时间和发两次包的时间差微乎其微,可以忽略。而在网络环境差的情况下,发送两次包的TCP,在验证数据包完整性上,有非常大的优点。

100 Continue:服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。

服务器第一次返回的 100 continue header报文,是由客户端对http的post和get的请求策略决定的,目的是为了避免浪费资源,节省带宽,数据传输消耗的时间等。只是客户端的post请求会在发送header的时候添加expect 100去探探路,如果失败了就不用继续发送data,从而减少了资源的浪费。所以是否在发送一个包取决了客户端的实现策略,和get/post并没有关系。有的客户端浏览器fireFox就只发送一个包。

Get和Post请求的本质上都是建立TCP连接,而无差别。

只是由于HTTP的规定和浏览器、服务器的限制,导致他们在应用过程中表现出一些不同。

猜你喜欢

转载自blog.csdn.net/panjunnn/article/details/108668745