这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战html
GET
和POST
,二者是HTTP
协议中发送请求的方法web
GET
方法请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据api
POST
方法用于将实体提交到指定的资源,一般致使在服务器上的状态变化或反作用数组
本质上都是TCP
连接,并没有差异浏览器
可是因为HTTP
的规定和浏览器/服务器的限制,致使他们在应用过程当中会体现出一些区别缓存
从w3schools
获得的标准答案的区别以下:安全
貌似从上面看到GET
与POST
请求区别很是大,但二者实质并无区别服务器
不管 GET
仍是 POST
,用的都是同一个传输层协议,因此在传输上没有区别markdown
当不携带参数的时候,二者最大的区别为第一行方法名不一样cookie
POST /uri HTTP/1.1 \r\n
GET /uri HTTP/1.1 \r\n
当携带参数的时候,咱们都知道GET
请求是放在url
中,POST
则放在body
中
GET
方法简约版报文是这样的
GET /index.html?name=qiming.c&age=22 HTTP/1.1
Host: localhost
复制代码
POST
方法简约版报文是这样的
POST /index.html HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
name=qiming.c&age=22
复制代码
注意:这里只是约定,并不属于HTTP
规范,相反的,咱们能够在POST
请求中url
中写入参数,或者GET
请求中的body
携带参数
HTTP
协议没有Body
和 URL
的长度限制,对 URL
限制的大可能是浏览器和服务器的缘由
IE
对URL
长度的限制是2083字节(2K+35)。对于其余浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操做系统的支持
这里限制的是整个URL
长度,而不只仅是参数值的长度
服务器处理长 URL
要消耗比较多的资源,为了性能和安全考虑,会给 URL
长度加限制
POST
比 GET
安全,由于数据在地址栏上不可见
然而,从传输的角度来讲,他们都是不安全的,由于 HTTP
在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文
只有使用HTTPS
才能加密安全
对于GET
方式的请求,浏览器会把http header
和data
一并发送出去,服务器响应200(返回数据)
对于POST
,浏览器先发送header
,服务器响应100 continue
,浏览器再发送data
,服务器响应200 ok
并非全部浏览器都会在POST
中发送两次包,Firefox
就只发送一次
HTTP头字段(HTTP header fields),是指在超文本传输协议(HTTP)的请求和响应消息中的消息头部分
它们定义了一个超文本传输协议事务中的操做参数
HTTP头部字段能够本身根据须要定义,所以可能在 Web
服务器和浏览器上发现非标准的头字段
下面是一个HTTP
请求的请求头:
GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0
复制代码
常见的请求字段以下表所示:
字段名 | 说明 | 示例 |
---|---|---|
Accept | 可以接受的回应内容类型(Content-Types) | Accept: text/plain |
Accept-Charset | 可以接受的字符集 | Accept-Charset: utf-8 |
Accept-Encoding | 可以接受的编码方式列表 | Accept-Encoding: gzip, deflate |
Accept-Language | 可以接受的回应内容的天然语言列表 | Accept-Language: en-US |
Authorization | 用于超文本传输协议的认证的认证信息 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 用来指定在此次的请求/响应链中的全部缓存机制 都必须 遵照的指令 | Cache-Control: no-cache |
Connection | 该浏览器想要优先使用的链接类型 | Connection: keep-alive Connection: Upgrade |
Cookie | 服务器经过 Set- Cookie (下文详述)发送的一个 超文本传输协议Cookie | Cookie: $Version=1; Skin=new; |
Content-Length | 以 八位字节数组 (8位的字节)表示的请求体的长度 | Content-Length: 348 |
Content-Type | 请求体的 多媒体类型 | Content-Type: application/x-www-form-urlencoded |
Date | 发送该消息的日期和时间 | Date: Tue, 15 Nov 1994 08:12:31 GMT |
Expect | 代表客户端要求服务器作出特定的行为 | Expect: 100-continue |
Host | 服务器的域名(用于虚拟主机 ),以及服务器所监听的传输控制协议端口号 | Host: en.wikipedia.org:80 Host: en.wikipedia.org |
If-Match | 仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操做。主要做用时,用做像 PUT 这样的方法中,仅当从用户上次更新某个资源以来,该资源未被修改的状况下,才更新该资源 | If-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Modified-Since | 容许在对应的内容未被修改的状况下返回304未修改 | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
If-None-Match | 容许在对应的内容未被修改的状况下返回304未修改 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Range | 若是该实体未被修改过,则向我发送我所缺乏的那一个或多个部分;不然,发送整个新的实体 | If-Range: "737060cd8c284d8af7ad3082f209582d" |
Range | 仅请求某个实体的一部分 | Range: bytes=500-999 |
User-Agent | 浏览器的浏览器身份标识字符串 | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0 |
Origin | 发起一个针对 跨来源资源共享 的请求 | Origin: www.example-social-network.com |
经过配合请求头和响应头,能够知足一些场景的功能实现:
协商缓存是利用的是【Last-Modified,If-Modified-Since】
和【ETag、If-None-Match】
这两对请求头响应头来管理的
Last-Modified
表示本地文件最后修改日期,浏览器会在request header加上If-Modified-Since
(上次返回的Last-Modified
的值),询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来
Etag
就像一个指纹,资源变化都会致使ETag
变化,跟最后修改时间没有关系,ETag
能够保证每个资源是惟一的
If-None-Match
的header会将上次返回的Etag
发送给服务器,询问该资源的Etag
是否有更新,有变更就会发送新的资源回来
而强制缓存不须要发送请求到服务端,根据请求头expires
和cache-control
判断是否命中强缓存
强制缓存与协商缓存的流程图以下所示:
cookie
,类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据,经过响应头set-cookie
决定
做为一段通常不超过 4KB 的小型文本数据,它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie
有效期、安全性、使用范围的可选属性组成
Cookie
主要用于如下三个方面: