HTTP简介
HTTP协议
HTTP是超文本传输协议(hypertext transfer protocol),是TCP/IP协议的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程。客户端(client)连上web服务器后,想获得web服务器中的某个web资源,需要遵循一定的通讯格式,HTTP协议就是用于定义web客户端和web服务器间通讯的格式。
HTTP 1.0和HTTP 1.1的区别
- 在http 1.0协议中,客户端与web服务器建立连接之后,只能获得一个web资源。
- 在http 1.1协议中,允许客户端与web服务器建立连接后,只在一个连接上获取多个web资源。
HTTP报文
HTTP报文是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟可选的数据模块(由一个空行分隔)。
HTTP使用术语流入(inbound)和流出(outbound)来描述HTTP事务处理(transaction)的方向
- 流入:流向服务器
- 流出:流出服务器
报文始终向下游(downstream)流动,所有报文的发送者都在接受者的上游(upstream)
HTTP请求(request)
请求报文请求服务器对资源进行一些操作。
客户端连接上服务器之后,向服务器请求某个web资源,称之为客户端向web服务器发送了一个HTTP请求。
一个完整的HTTP请求包括如下内容:
- 对报文进行描述的起始行(start line)
- 包含属性的首部块(header)(消息头)
- 包含数据的主体(body)(可选)
请求报文格式:
<method> <request-URL> <version>(CRLF)
<headers>(CRLF)
(CRLF)
<entity-body>(CRLF)
“HTTP请求报文”
起始行(start line)
请求报文的起始行或称为请求行,包含了一个方法、一个请求URL和HTTP版本号。
- 方法描述了服务器应该执行的操作
- 请求URL描述了要对哪个资源执行这个方法
- HTTP版本号告知服务器,客户端使用的是哪种HTTP
常用HTTP方法
方法用来告诉服务器做什么事情,浏览器的默认请求方法为GET
方法 | 描述 | 是否包含主体 |
---|---|---|
GET | 从服务器获取一份文档 | 否 |
HEAD | 只从服务器获取文档的首部 | 否 |
POST | 向服务器发送需要处理的数据 | 是 |
PUT | 将请求的主体部分存储在服务器上 | 是 |
TRACE | 对可能经过代理服务器传送到服务器上去的报文进行追踪 | 否 |
OPTIONS | 决定可以在服务器上执行那些方法 | 否 |
DELETE | 从服务器上删除一份文档 | 否 |
扩展方法 | 对HTTP规范的扩展,由服务器自己实现 |
HTTP常用请求首部块
键值对列表,请求首部块中可以包含 通用首部、请求首部、实体首部、扩展首部
首部名称 | 描述 | 首部实例 |
---|---|---|
accept | 浏览器通过这个头告诉服务器,它所支持的数据类型 | Accept: application/x-ms-application, image/jpeg |
Accept-Charset | 浏览器通过这个头告诉服务器,它支持哪种字符集 | Accept-Charset:utf-8 |
Accept-Encoding | 浏览器通过这个头告诉服务器,支持的压缩格式 | accept-encoding:gzip, deflate, br |
Host | 浏览器通过这个头告诉服务器,想访问哪台主机 | Host: localhost:8080 |
If-Modified-Since | 浏览器通过这个头告诉服务器,缓存数据的时间 | |
Referer | 浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链 | |
Connection | 浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接 | Connection: Keep-Alive |
HTTP响应(response)
响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。
一个HTTP响应代表服务器向客户端回送的数据,包括:
- 用于描述服务器对请求的处理结果的状态行
- 消息头
- 实体内容
响应报文格式:
<version> <status> <reason-phrase>(CRLF)
<headers>(CRLF)
(CRLF)
<entity-body>(CRLF)
起始行(start line)
响应报文的起始行或称为响应行,包含了响应报文使用的HTTP版本、数字状态码,以及描述操作状态的文本形式的原因短语。
常用响应状态码
状态码告诉客户端发生了什么
整体范围 | 已定义范围 | 分类 | 含义 |
---|---|---|---|
100~199 | 100~101 | 信息成功 | 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个过程 |
200~299 | 200~206 | 成功 | 表示成功接收请求并已完成整个处理过程,常用200 |
300~399 | 300~305 | 重定向 | 为完成请求,客户需进一步细化请求。例如,请求的资源已经移动到一个新的地址,常用302、304 |
400~499 | 400~415 | 客户端错误 | 客户端的请求有错误,常用404 |
500~599 | 500~505 | 服务器错误 | 服务器端出现错误,常用500 |
- | - | - | - |
HTTP常用响应头
响应首部可以包含 通用首部、响应首部、实体首部、扩展首部
首部名称 | 描述 | 首部实例 |
---|---|---|
Location | 服务器通过这个头,来告诉浏览器跳到哪里 | |
Server | 服务器通过这个头,告诉浏览器服务器的型号 | server:HTTP server (unknown) |
Content-Encoding | 服务器通过这个头,告诉浏览器,数据的压缩格式 | content-encoding:gzip |
Content-Length | 服务器通过这个头,告诉浏览器回送数据的长度 | content-length:212 |
Content-Language | 服务器通过这个头,告诉浏览器语言环境 | |
Content-Type | 服务器通过这个头,告诉浏览器回送数据的类型 | content-type:application/json; charset=UTF-8 |
Refresh | 服务器通过这个头,告诉浏览器定时刷新 | |
Content-Disposition | 服务器通过这个头,告诉浏览器以下载方式打数据 | content-disposition:attachment; filename=”f.txt” |
Transfer-Encoding | 服务器通过这个头,告诉浏览器数据是以分块方式回送的 | |
Expires | 控制浏览器不要缓存 | expires:Fri, 01 Jan 1990 00:00:00 GMT |
Cache-Control | Cache-Control: no-cache | |
Pragma | Pragma: no-cache |