前面的话
对于HTTP协议,我们并不陌生,随随便便浏览一个网页就接触到了http协议。前一篇文章说的Ajax技术,涉及到了GET与POST请求就是属于http协议的方法。下面详细说一说http协议。
什么是HTTP协议?
- HTTP是超文本传输协议(Hypertext Transfer Proocol),是客户端与服务器端之间通信的规则。通信双方都需要遵守规则,才能通信。(最常见的客户端就是浏览器)
- HTTP是基于TCP/IP四层协议中的应用层协议。
- HTTP服务器端监听的默认端口是80。
HTTP特点
- 简单连接,通信快
- 允许传输任意类型的数据对象:传输类型由Content-Type 加以标记
- HTTP 0.9和1.0是非持续连接,每次TCP连接只能发送一次请求;HTTP1.1是持续连接,TCP连接默认不关闭,可以被多个请求复用。对于同一个域名,大多数浏览器允许同时建立6个持久连接。默认开启Connection:keep-alive.
- HTTP 是一个无状态的协议:对于之前的交互没有记录。每次交互只能用此次的信息,要想使用前面的信息,就必须重传。即无法保存或维持某一状态。
HTTP工作原理
HTTP协议定义的就是客户端与服务端之间相互通信的规则,采用的是请求/响应模型。客户端向服务器发一个请求报文,服务器接收请求后,就会作出响应。
- 请求报文:包含请求行(请求的方法,URL、协议版本)、请求头部、空行和请求数据4部分
- 响应报文:包含状态行(协议版本、状态码、服务信息)、响应头部、空行和响应数据4部分
HTTP 请求/响应的步骤:
- 客户端连接到服务器:建立TCP连接
- 发送HTTP请求:客户端向服务端发送一个请求报文
- 服务器接受请求并返回HTTP响应
- 客户端显示内容
- 释放TCP连接
例如:一个面试官经常考的一个问题,在浏览器地址栏里面输入URL,按下回车后会经历哪些流程?
- 域名解析:浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址
- 建立TCP连接:解析IP地址之后,该IP地址与服务器端的默认的端口80构成套接字浏览器与服务器之间建立TCP连接。
- 浏览器发送HTTP请求:浏览器构建HTTP请求报文,通过TCP协议传送到服务器的指定端口。
- 服务器对浏览器做出响应: 服务器处理HTTP请求,并返回响应报文。
- 浏览器解析渲染页面:解析HTML文档,构建DOM树、Render树、布局、绘制、显示。
- 释放TCP连接
HTTP请求报文格式
- 请求行:包括请求方法(常见的有GET与POST)、URL、HTTP协议及版本
- 请求头部:如果客户端还需要携带请求的其他信息,就可以写在请求头部。
常见的请求头字段的含义:- Host : 表示服务器的域名以及服务器所监听的端口号
- User-Agent:代表用户使用的客户端(一般来说是代表浏览器的字符串)
- Accept: 表示客户端可以接受的返回资源的类型,* 表示所有类型
- Accept-Charset:表示客户端可以接受的字符集
- Accept-Language:表示客户端可以接受的语言
- Connection:表示客户端与浏览器之间的连接类型。(长连接使用keep-alive)
- Cookie:当前页面设置的任何Cookie
- Referer:发出请求的页面的URL
- Origin:发起一个针对跨域资源共享的请求。表明来自哪里的跨域。
- 空行:通过空行告诉服务器请求头部到此为止
- 请求数据
-
若请求方法是GET,那么此项为空,没有数据
-
若请求方法是POST,则通常来说这里放置要提交的数据
比如使用POST方法来提交一个表单,其中user字段中的数据为“admin”,password字段为123456,那么这里的请求数据就是user=admin&password=123456,使用&来连接各字段。
来看一个POST请求的例子:
上面的POST方法,它的请求URL段中一般没有参数,参数放在报文体(请求数据)中。而GET方法直接放在URL中,报文体则为空。
-
HTTP响应报文格式
-
状态行:包括协议版本、状态码、其他服务信息
-
响应头部:用于描述服务器的基本信息,以及数据描述。服务器通过这些描述信息,可以通知客户端如何处理响应的数据
常见的响应头字段含义:
- Allow:服务器接受哪些请求方法
- Access-Control-Allow-Origin:表示允许跨域的访问。可以设置为上面origin的地址(设置为*表示允许所有来源访问)
- Content-Type:表示后面的文档类型。
- Date: 生成响应的时间
- Refresh:服务器通过这个头字段告诉浏览器多久刷新一次
- Set-Cookie: 设置和页面关联的Cookie
- Server:服务器的名字
-
空行 :表示响应头部到此为止
-
响应数据: 响应体就是响应的消息数据,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。
看一个实例:
HTTP头域
HTTP头域包括通用头域、请求头域、响应头域、实体头域
- 通用头域:通用头域包含请求和响应消息都支持的头域。如: Cache-Control:指请求与响应遵循的缓存机制、 Date:表示消息发送的时间
- 请求头域: 是请求头部中独有的。如上面出现的Host、Cookie、Referer等
- 响应头域:是响应头部中独有的。如set-cookie
- 实体头域:请求消息和响应消息都可以包含实体信息,如Allow、Content-type、Content-Encoding 等
即请求头部与响应头部中,可以包含通用头域与实体头域。
HTTP请求方法
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
- GET : 最常用的一种,用于从服务器上“得到”某个资源
- HEAD:跟GET一样,也是请求服务器资源,但是只要响应的Headers,不常用
- POST:往服务器上写入数据(如提交表单信息),跟GET作用相反
- PUT:也是写入数据,通常是PORT创建新数据,PUT用来更新已有数据
- DELETE : 删除服务器上的数据
- 其他还有TRACE、OPTIONS、CONNECT
(关于GET与POST的“区别下篇再说”)
HTTP状态码
-
1XX(信息)— 表示请求已接受,继续处理
-
2XX(成功) — 表示请求已经被成功接受
-
3XX(重定向)— 要完成请求必须进行附加操作
-
4XX(客户端错误) — 请求有语法错误或请求无法实现
-
5XX(服务器端错误)— 服务器处理某个正确的请求时发生错误
常见的状态码:
- 200 客户端请求成功
- 301 永久重定向(请求的资源已被永久的移动到新URI)
- 302 临时重定向 (资源只是临时被移动。客户端应继续使用原有URI)
- 304 所请求的资源为修改,服务器不会返回任何资源
- 404 资源不存在
- 500 服务器发生不可预期的错误
- 503 服务器暂时不能处理当前的客户端请求,一段时间恢复
参考链接: