HTTP是基于TCP的,HTTP作为应用层协议,会在TCP/IP协议栈往下传递的时候,不断封装数据帧,如下图:
上面HTTP正文即是以我们HTTP报文格式来组织的。下面我们看看具体的HTTP报文的格式。
3.1、HTTP报文组成部分HTTP请求和响应都使用如下通用的格式:
start-line:起始行,起始行可以为以下两者之一:
Request-Line:请求行,如:
GET /hello-world2.html HTTP/1.1
Status-Line:状态行,如:
HTTP/1.1 200 OK
*(message-header CRLF):0个或者多个消息头;
CRLF:一个空行;
[message-body]:可选的消息体;
可以分别把请求报文和响应报文分开来描述:
请求报文
响应报文
可以发现,请求报文和响应报文格式就起始行不一样。
下面我们逐个来介绍。
为了尽可能保证内容的准确性,下面报文各种字段说明部分内容,大部分整理自RFC2616和MDN web docs:
Hypertext Transfer Protocol -- HTTP/1.1 2616
HTTP. MDN web docs
《HTTP权威指南》
以上资料内容有冲突的,以RFC2616的为准。
3.2、请求行请求行格式:
Request-Line = Method SP Request-URI SP HTTP-Version CRLF 3.2.1、Method方法是区分大消息的,以下是常用的方法:
方法 说明OPTIONS 列出可以对服务器资源执行哪些方法
GET 获取资源
HEAD 获取资源的首部,与GET类似,但是不会响应消息体
POST 向服务器提交数据
PUT 将请求主体部分存储在服务器上
DELETE 删除资源
TRACE 对可能经过代理服务器传送到服务器上的报文进行追踪
CONNECT 建立连接隧道
extension-method 扩展方法
另外,服务器还可以实现一些自己的请求方法,这些附加的方法是对HTTP规范的扩展,因此也成为扩展方法。
extension-method = token
请求可能的返回结果:
405:表示请求的方法不被允许,这个时候服务器响应头会响应当前资源允许的方法,如:
Allow: GET, HEAD, PUT
501:代表原服务器的该方法未能被识别或者未实现;
下面逐个方法介绍下:
GETGET方法意味着可以检索 Request-URI标识的任何信息。
如果Request-URI涉及到创建数据,则应该将新建的数据作为响应实体返回。
如果请求消息包含 If-Modified-Since,If-Unmodified-Since,If-Match,If-None_match或If-Range标头字段,则此时的Get为条件GET。通过使用缓存标头,可以尽可能避免不必要的网络传输。
如果请求标头包含Range,则GET方法变为部分GET。
HEADHEAD方法与GET方法很类似,但是HEAD方法在在响应中只返回首部,不会反悔消息体。
这就允许客户端再不用获取实际资源的情况下,对资源首部进行检查。如:
检查资源是否有更新:如果获取到的 Content-Length、Content-MD5、ETag、Last-Modified与之前获取到的值不同,那么缓存应该被视为过期;
查看响应状态码,查看资源是否存在;
获取首部更多信息,判断资源情况。
POSTPOST方法起初是用来向服务器传输数据的,通常用来提交HTML的表单到服务器。
PUTPUT方法用于向服务器写入资源,如果Request-URI对应的资源已经存在的话,就进行更新。
注意:
POST用于向服务器发送数据,PUT用于向服务器上的资源中存储数据。
DELETE