HTTP 原理
HTTP 是应用层协议,通过 TCP 实现可靠传输,能够保证数据的完整性、正确性。
C/S 架构的交互流程
- 客户端执行网络请求,从 URL 解析服务端的主机名
- 主机名解析成 IP 地址
- 从 URL 解析出端口号
- 建立客户端到服务端的 TCP 连接
- 客户端通过输出流向服务端发送一条 HTTP 请求
- 服务端向客户端回送一条 HTTP 响应报文
- 客户端从输入流获取报文
- 客户端解析报文,关闭连接
- 客户端将结果显示在 UI
HTTP 请求方式
HTTP 常见请求方式有 GET、POST、DELETE、PUT、HEAD、TRACE、OPTIONS。
GET
用来获取服务器中的某个资源
POST
用来向服务器传递数据,比如递交 HTML 表单
PUT
用来向服务器写入资源。有些发布系统允许用户创建 Web 页面,并用 PUT 直接将其传输到 Web 服务器上
DELETE
用来请服务器删除 URL 所指定的资源。但是,客户端应用程序无法保证删除操作一定会被执行。因为,HTTP 规范允许服务器在不通知客户端的情况下撤销请求
HEAD
与 GET 方法行为类型,但是服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。
TRACE
TRACE 方法允许客户端在最终将请求发送给服务器时,看看它变成什么样子。TRACE 请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求/响应链上,原始报文是否以及如何被毁坏或修改过。
OPTIONS
OPTIONS 方法请求 Web 服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法(有些服务器可能只支持对一些特殊类型对象使用特定的操作)。这为客户端应用程序提供了一种手段,使其不用实际访问那些资源就能判定访问各种资源的最优方式。
HTTP 报文格式解析
HTTP 请求报文由请求行(request line)、请求头部(header)、空行和请求数据 4 个部分组成。
|请求方法 | 空格 | URL | 空格 | HTTP 版本 | 回车符 | 换行符 |
| ----------头部字段名:值 --------- | 回车符 | 换行符 |
|------回车符 -----------|------- 换行符---------- |
|-------------------请求数据-------------------- |
1.起始行
报文的第一行就是起始行,在请求报文中用来说明要以什么方式做什么请求,而在响应报文中粗略说明了报文的执行结果。
2.首部字段
起始行后面有零个或者多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(如 Connection:Keep-Alive)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。
3.主体
首部字段的空行之后就是可选的报文主体,其中包含了所有类型的数据。请求主体中包括了要发给 Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是结构化的文本形式,而主体可以包含任意的二进制数据(如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。
响应报文
HTTP 响应也由 3 个部分组成,分别是:状态行、消息报头、响应正文。
<状态行>
<响应报文 header>
<空行>
[响应报文内容]
在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明请求的资源情况。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version 表示服务器 HTTP 协议的版本;Status-Code 表示服务器发回的响应状态代码;Reason-Phrase 表示状态代码的文本描述。状态代码由 3 位数字组成,第一个数字定义了响应的类别,有 5 中可能取值。
取值范围 | 含义 |
---|---|
100-199 | 指示信息-表示请求已经接收,继续处理 |
200-299 | 请求成功。表示请求已经被成功接收、理解 |
300-399 | 重定向。要完成请求必须做进一步操作 |
400-499 | 客户端错误。请求有语法错误或请求无法实现 |
500-599 | 服务器端错误。服务器未能实现合法请求 |
常见状态代码
代码 | 状态 | 说明 |
---|---|---|
200 | OK | 客户端请求成功 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经授权 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 | Not Found | 请求资源不存在 |
500 | Internal Server Error | 服务器发生不可预期错误 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求 |