Http 协议
HTTP(超文本传输协议)协议是建立在 TCP 传输协议之上的应用层协议。HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于 1990 年提出,经过多年的使用和发展,得到了不断的完善和扩展。
HTTP 协议的主要特点如下。
- 支持 Client/Server 模式;
- 简单 -- 客户向服务器请求服务时,只需指定服务 URL,携带必要的请求参数或者消息体
- 灵活 -- HTTP 允许传输任意类型的数据对象,传输的内容类型由 HTTP 消息头中的的 Content-Type 加以标记
- 无状态 -- HTTP 协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要之前的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快,负载较轻。
一、HTTP 协议的 URL
HTTP URI(URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息)的格式如下。
http://host[":"port] [abs_path)
其中,http 表示要通过 HTTP 协议来定位网络资源;host 表示合法的 Internet 主机域名或者 IP 地址;port 指定一个端口号,为空则使用默认端口 80; abs_path 指定请求资源的 URI,如果 URL 中没有给出 abs_path,那么当它作为请求 URI 时,必须以 “/” 的形式给出,通常这点工作测览器会自动帮我们完成。
二、HTTP 请求消息(HttpRequest)
HTTP 请求由三部分组成,具体如下。
- HTTP 请求行
- HTTP 消息头
- HTTP 请求正文
请求行以一个方法符开头,以空格分开,后面跟着请求的的 URI 和协议的版本,格式为:
Method Request-URI HTTP-Version CRLF
其中 Method 表示请求方法, Request-URI 是一个统一资源标识符,HTTP-Version 表示请求的 HTTP 协议版本,CRLF 表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CR 或 LF 字符)。
请求方法有多种,各方法的作用如下。
- GET(获取) :请求获取 Request-URI 所标识的资源
- POST(修改) :在 Request-URI 所标识的资源后附加新的提交数据
- HEAD :请求获取由 Request-URI 所标识的资源的响应消息报头
- PUT(添加) :请求服务器存储一个资源,并用 Request-URI 作为其标识
- DELETE(删除) :请求服务器删除 Request-URI 所标识的资源
- TRACE :请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT :保留将来使用
- OPTIONS :请求查询服务器的性能,或者查询与资源相关的选项和需求
通过服务端抓包,打印 GET 请求消息头,内容如下:
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BAIDUID=18BAFC9B789FD50EB53E7012C7A149A5:FG=1; PSTM=1523451267; BD_UPN=12314553; ispeed_lsm=0; locale=zh; BD_HOME=1; sug=3; sugstore=0; ORIGIN=2; bdime=0
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。常用的请求报头如表 1 所示。HTTP 请求消息体是可选的,比较常用的 HTTP+XML 协议就是通过 HTTP 请求和响应消息体来承载 XML 信息的。
HTTP 常用的请求消息头
(1) Accept
指定客户端接受哪些类型的信息。例如:
Accept: image/gif
表明客户端希望接受GIF图像格式的资源
(2) Accept-Charset
指定客户端接受的字符集。例如:
Accept-Charset: iso-8859-1, gb2312
如果在请求消息中没有设置这个域,默认是任何字符集都可以接受。
(3) Accept-Encoding
指定客户端可接受的内容编码。例如:
Accept-Encoding: gzip, deflate
如果请求消息中没有设置这个域,则服务器假定客户端对各种内容编码都可以接受。
(4) Accept-Language
指定客户端接受的自然语言,例如:
Accept-Language: zh-cn
如果请求消息中没有设置这个报头域,则服务器假定客户端对各种语言都可以接受。
(5) Authorization
主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为 401 未授权),可以发送一个包含 Authorization 请求报头域的请求,要求服务器对其进行认证
(6) Host
发送请求时,该报头域是必需的,用于指定被请求资源的 Internet 主机和端口号,它通常是从 HTTP URL 中提取出来的。
(7) User-Agent
允许客户端将它的操作系统、浏览器和其他属性告诉服务器。
(8) Content-Type
表示后面的文档属于什么 MIME 类型。 Servlet 默认为 explain,但通常需要显式地指定为 text/html。由于经常要设置 Content-Type,因此 HttpServletResponse 提供了一个专用的方法 setContentType。
(9) Content-Length
请求消息体的长度。
(10) Connection
连接类型。
三、HTTP 响应消息(HttpResponse)
处理完 HTTP 客户端的请求之后,HTTP 服务端返回响应消息给客户端,HTTP 响应也是由三个部分组成,分别是
- 状态行
- 消息报头
- 响应正文
状态行的格式为
HTTP-Version Status-Code Reason-Phrase CRLF
其中 HTTP- Version 表示服务器器 HTTP 协议的版本, Status-Code 表示服务器返回的响应状态代码。状态代码由三位数字组成,第一个数字定义了响应的类别,它有 5 种可能的取值
- 1xx:指示信息。表示请求已接收,继续处理
- 2xx: 成功。表示请求已被成功接收、理解、接受
- 3xx: 重定向。要完成请求必须进行更进一步的操作
- 4xx: 客户端错误。请求有语法错误或请求无法实现
- 5xX: 服务器端错误。服务器未能处理请求。
常见的状态代码、状态描述如表 1 所示。
状态码 | 状态描述 |
---|---|
200 | OK:客户端请求成功 |
400 | Bad Request:客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized:请求未经投权,这个状态代码必须和 WWW-Authenticate 报头域一起使用 |
403 | Forbidden:服务器收到请求,但是拒绝提供服务 |
404 | Not Found:请求资源不存在 |
500 | Internal Server Error:服务器发生不可预期的错误 |
503 | Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对 Request-URI 所标识的资源进行下一步访问的信息。常用的响应报头如下所示。
(1) Location
用于重定向接收者到一个新的位置, Location 响应报头域常用于更换域名的时候
(2) Server
包含了服务器用来处理请求的软件信息,与 User- Agent 请求报头域是相对应的
(3) WWW-Authenticate
必须被包含在 401(未授权的)响应消息中,客户端收到 401 响应消息,并发送 Authorization 报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域
每天用心记录一点点。内容也许不重要,但习惯很重要!