基础概念
什么是HTTP?
HTTP协议是超文本传输协议(Hyper Text Transfer Protocol)的缩写,是一种用于分布式、协作式和超媒体信息系统的应用层(Application Layer)协议,是万维网的数据通信基础.最初HTTP是为了提供一种发布和接受HTML页面的方法.
HTTP的特点
- HTTP是无状态的(stateless): 服务器对客户端的访问没有任何记录,因此当客户端第二次访问访问服务器的同一个页面时,服务器的响应和第一次访问是一样的. HTTP的无状态特性使服务器更容易支持大量并发的HTTP请求.
- HTTP是无连接的: 每次连接只处理一个请求.服务器处理完客户的请求,并收到客户的应答后,即断开连接.采用这种方式可以节省传输时间.
- 支持Client/Server模式.
- 灵活: HTTP允许传输任意类型的数据,使用Content-Type标记传输的数据类型即可.
- 简单快速: 客户端向服务器请求数据时, 只需要传送请求方法和路径.
HTTP URL
HTTP URL 用来标识可以通过HTTP进行访问的网络资源. HTTP URL使用如下格式(参考RFC1738):
// HTTP URL格式
http://<host>:<port>/<path>?<searchpart>
// HTTP URL 例子
http://www.tinyscope.com:8080/repes/index.asp?user=zhang&pwd=123
- 协议部分:
http
是 HTTP URL的协议部分.用来标记这是一个使用HTTP协议的URL. - 主机地址(host): 网络主机的完全限定名(域名)/网络主机的IP地址,比如:
www.tinyscope.com
或192.168.1.1
. - 端口(port): 请求服务器的端口, 如果省略则默认是 80 端口.
- 资源路径(path):
repes/index.asp
代表访问的资源在服务器上的路径. - 参数/搜索部分(searchpart):
user=zhang&pwd=123
传递给服务端的一些查询条件.
HTTP 工作原理
- 客户端与服务器建立连接, HTTP是在传输层使用的可靠TCP连接, 因此在发送HTTP请求前需要先建立TCP连接.
- 客户端发送HTTP请求给服务器
- 服务器发送HTTP响应给客户端.
- 客户端和服务器断开连接(TCP连接).
HTTP报文格式
HTTP请求报文
HTTP 的请求报文主要由请求行、请求头部和请求体组成格式如下
- 请求行: HTTP请求行由 方法名、URL中的path部分和HTTP协议的版本组成三部分中金使用空格隔开,最后是一个回车换行.
- Method: GET、POST、DELETE、HEAD、PUT等.
- Path: 资源在服务器的路径.
- 协议版本: HTTP/主版本号.次版本号, 比如: HTTP/1.0和HTTP/1.1 等.
- 请求头(Headers): HTTP所支持的头部字段组成的键值对.会在后面进行详细介绍.
- 请求体(Body) : 可选部分, 请求携带的数据,比如GET没有这部分, POST上传上传数据时就有.
示例数据
GET /users HTTP/1.1
Host: www.tinyscop.com
Content-Type: text/plain
Content-Length: 5
12345
对应的解释如下
HTTP响应报文
HTTP响应报文主要由状态行、响应头和响应数据组成
- 状态行: http协议版本、状态码和状态信息组成, 使用空格隔开
- 协议版本: 和请求中的一样
- 状态码: HTTP响应状态码,下面会详细介绍
- 状态信息: 对响应状态码的进一步描述信息.
- 响应头: 增加一些HTTP头部字段, 比如Content-Type、Accept等.
- 响应体: 服务器返回的数据.
示例数据
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 5
12345
HTTP 请求方法
- GET: 用于获取服务器资源, 对服务器数据不进行修改 请求体没有Body.如果有参数则拼接在URL中
GET /users/1 HTTP/1.1 Host: www.baidu.com
- POST: 向指定资源提交数据,请求服务器进行处理, 用于增加/修改服务器资源, 发送的数据在Body中.
POST /users HTTP/1.1 Host: www.baidu.com Content-Type: application/x-www-form-urlencoded Content-Length: 16 name=wsj&pwd=123
- HEAD: 与GET方法一样,都是向服务器发出指定资源的请求.只不过服务器将不传回资源的本文部分.它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息"(元信息或称元数据). 和GET的却别就是不返回Body.
- PUT: 向指定资源位置上传其最新内容.也就是修改资源, 发送给服务器的数据放在Body中.
- DELETE: 删除服务器资源, 不发送Body.
HTTP 头部字段(Headers)
协议头的字段,是在HTTP请求行/响应行之后传输的. 协议头的字段是以明文的键值对字符串格式传输的.并以回车(CR)加换行(LF)符号序列结尾.
- Host: 服务器的域名以及服务器监听的端口, 如果没有写端口则使用协议默认端口,HTTP的默认端口是80.
- Content-Type: 指定Body数据类型
- application/x-www-form-urlencoded: 数据被编码成以 ‘&’ 分隔的键-值对, 同时以 ‘=’ 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因(应使用 multipart/form-data 代替).
- multipart/form-data: HTTP POST上传文件.
- text/html: 将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理.
- text/plain : 将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理.
- application/json: body 是json 字符串的格式.
- Accept: 客户端能接受的数据类型。如 text/html
- Accept-Charset: 客户端接受的字符集。如 utf-8
- Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
- Content-Encoding:压缩类型。如 gzip
- Content-Length: 指定Body的长度单位字节.
Transfer-Encoding: chunked
: 分块传输, 此时Body会分成多个块来传输.- Location : 重定向后的URL地址.
- User-Agent: 用户代理, 也就是客户端程序.
- Range/Accept-Range : 获取指定范围的数据. 可以实现断点续传.多线程下载等.
Accept-Range: bytes
响应报⽂中出现,表示服务器⽀持按字节来取范围数据Range: bytes=<start>-<end>
请求报⽂中出现,表示要取哪段数据Content-Range:<start>-<end>/total
响应报⽂中出现,表示发送的是哪段数据
HTTP 状态码(Status Code)
HTTP状态码是用以表示HTTP响应状态的3位数字代码, 有五种打的状态分类, 状态码的第一个数字代表五种状态之一.
- 1xx消息: 请求已被服务器接收,继续处理.
- 101 : 切换协议.比如切换HTTP版本.
- 2xx成功: 代表请求已成功被服务器接收、理解、并接受.
- 200 : 客户端请求成功.
- 3xx重定向: 需要客户端采取进一步的操作才能完成请求.通常,这些状态码用来重定向,后续的请求地址在本次响应的Location域中指明.
- 301: 永久移动.
- 302: 暂时移动.
- 303: 暂时移动.
- 304: 内容未改变.
- 4xx客户端错误: 说明客户端发送的请求有问题, 比如参数不合法等.
- 400 : Bad Request 客户端请求有语法错误,不能被服务器所理解
- 401 : Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 : Forbidden 服务器收到请求,但是拒绝提供服务
- 404 : Not Found 请求资源不存在,eg:输入了错误的URL
- 5xx服务器错误: 服务端发生错误.
- 500 : Internal Server Error 服务器发生不可预期的错误
- 503 : Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常