你真的弄懂 HTTP 了吗?(三)

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战html

相关文章:

1、说一下 GET 和 POST 的区别?

1.1 是什么

GETPOST,二者是HTTP协议中发送请求的方法web

GET

GET方法请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据api

POST

POST方法用于将实体提交到指定的资源,一般致使在服务器上的状态变化或反作用数组

本质上都是TCP连接,并没有差异浏览器

可是因为HTTP的规定和浏览器/服务器的限制,致使他们在应用过程当中会体现出一些区别缓存

1.2 区别

w3schools获得的标准答案的区别以下:安全

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址能够被Bookmark,而POST不能够。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,由于参数直接暴露在URL上,因此不能用来传递敏感信息。
  • GET参数经过URL传递,POST放在Request body中

参数位置

貌似从上面看到GETPOST请求区别很是大,但二者实质并无区别服务器

不管 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 限制的大可能是浏览器和服务器的缘由

IEURL长度的限制是2083字节(2K+35)。对于其余浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操做系统的支持

这里限制的是整个URL长度,而不只仅是参数值的长度

服务器处理长 URL 要消耗比较多的资源,为了性能和安全考虑,会给 URL 长度加限制

安全

POST  GET 安全,由于数据在地址栏上不可见

然而,从传输的角度来讲,他们都是不安全的,由于 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文

只有使用HTTPS才能加密安全

数据包

对于GET方式的请求,浏览器会把http headerdata一并发送出去,服务器响应200(返回数据)

对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok

并非全部浏览器都会在POST中发送两次包,Firefox就只发送一次

2、说说 HTTP 常见的请求头有哪些? 做用?

2.1 是什么

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
复制代码

2.2 分类

常见的请求字段以下表所示:

字段名 说明 示例
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

2.3 使用场景

经过配合请求头和响应头,能够知足一些场景的功能实现:

协商缓存

协商缓存是利用的是【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是否有更新,有变更就会发送新的资源回来

而强制缓存不须要发送请求到服务端,根据请求头expirescache-control判断是否命中强缓存

强制缓存与协商缓存的流程图以下所示:

会话状态

cookie,类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据,经过响应头set-cookie决定

做为一段通常不超过 4KB 的小型文本数据,它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成

Cookie 主要用于如下三个方面:

  • 会话状态管理(如用户登陆状态、购物车、游戏分数或其它须要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等
相关文章
相关标签/搜索