HTTP的报文分为请求报文和响应报文,结构基本相同,由三大部分组成:
- 起始行(start line):描述请求或响应的基本信息;
- 头部字段集合(header):使用key-value形式更详细地说明报文;
- 消息正文(entity):实际传输数据,不一定是纯文本,可以实图片,视频等二进制数据。
HTTP协议起始行和头部是必须要有的,正文可以没有,头部结束有一个空行作为头部的结束。
起始行
请求报文里的起始行叫做请求行,简要的描述了客户端想要如何操作服务器端的资源。
响应报文里的起始行叫做状态行,描述了服务器响应的状态
请求行
先看例子
GET / HTTP/1.1
请求行由三部分组成:
- 请求方法:如GET/POST,表示对资源的操作;
- 请求目标:通常是一个URI,标记了请求方法要操作的资源;
- 版本号:表示报文使用的HTTP协议版本。
这三部分通常使用空格来分割,最后使用换行结束。
这个请求行里,GET是请求方法,之后跟了一个空格,接下来/是请求目标,又跟了个空格,接下来HTTP/1.1是版本号,接下来是/r/n换行。
HTTP/1.1规定了八种方法:
- GET:获取资源,可以理解为读取或者下载数据;
- HEAD:获取资源的元信息;
- POST:向资源提交数据,相当于写入或上传数据;
- PUT:类似 POST;
- DELETE:删除资源;
- CONNECT:建立特殊的连接隧道;
- OPTIONS:列出可对资源实行的方法;
- TRACE:追踪请求 - 响应的传输路径。
其中GET,POST,HEAD,PUT为常用方法。
URI里只能使用ASCII码,那要是需要使用汉语咋办呢,按照URI转义会把非ASCII码字符转换成十六进制,然后在每个十六进制字节前加上%,一个十六进制是四位,一个字节八位,所以类似于%E4%A7这样。
状态行
同样先看例子
HTTP/1.1 200 OK
状态行也由三部分组成:
- 版本号:表示报文使用的HTTP协议版本;
- 状态码:三位数字,用代码表示处理的结果;
- 原因:数字状态码的补充。
这个状态行里,HTTP/1.1是版本号,空格,200是状态码表示成功,空格,OK是原因作为对状态码200的补充,换行。
头部
请求行/状态行加上头部的字段就构成了HTTP报文的请求头/响应头
请求头/响应头的字段的类型可能不同,但是结构是相同的,都是字段名 :字段值 换行,字段名不区分大小写,字段名里不允许出现空格,字段名后面必须紧跟着:不能有空格。
头部字段基本可以分为四大类:
- 通用字段:在请求头和响应头里都可以出现;
- 请求字段:仅出现在请求头里;
- 响应字段:仅能出现在响应头里;
- 实体字段:属于通用字段,描述body的额外信息。
Host字段
属于请求字段,HTTP/1.1规范要求必须出现的字段。
Host字段告诉服务器这个请求应该由哪个主机来处理。
User-Agent字段
属于请求字段,使用一个字符串来描述发起HTTP请求的客户端,服务器可以一句它来返回最合适此浏览器显示的页面。
Date字段
属于通用字段,表示HTTP报文创建的时间。
Server字段
属于相应字段,告诉客户端当前正在提供WEB服务的软件名称和版本号,不是必须要出现的字段,也不一定要是真实的信息,可以是完全无关的描述信息。
Content-Length字段
属于实体字段,表示报文里body的长度。
参考自极客时间透视HTTP协议