HTTP报文结构
下图是一个完整的HTTP报文的形式,一共分为三层:
- 报文首部: 提供HTTP报文的信息,规定通信双方所遵循的一些规则,请求报文和响应报文的首部的关键字是不一样的;
- 空格:用来区分报文首部与报文主体;
- 报文主体:通信的实质性内容,如:客户端向服务器的请求内容,服务器向客户端的响应内容,也可以没有内容;
编码
HTTP在传输过程中可以按照数据的原样直接传播,也能够通过编码压缩的方式来提升传输速率。当然,在提升速率的同时是需要消耗一部分CPU的性能来进行压缩。
- 报文(message):是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
- 实体(enity):作为请求或响应的有效载荷数据被传输, 其内容由实体首部和实体主体构成。
通常来说报文和实体是没有区别的,但是当传输过程中进行编码操作后,传输的主体便由报文变成了实体。客户端、服务器双方约定相同的编码形式,就可以对报文进行解压缩了。常用的内容编码有如下几种:
- gzip(GNU zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identify(不进行编码)
HTTP的请求方法
-
GET
:获取资源,请求访问已被URI识别的资源。 -
POST
:POST
和GET
的方法很相似,但是其主要目的是传输实体,也就是用于传递大量数据至服务器的方法。 -
PUT
:传输文件,如同FTP协议中上传文件的方式一样,要求在请求报文主体部分包含文件内容,保存至请求URI指定的位置,由于本身不带验证机制,导致无法保证服务器的安全性,基本上都是被禁用的。 -
DELETE
:删除文件,PUT
的逆操作。同PUT
一样,由于没有验证机制,故基本上被禁用。 -
HEAD
:GET操作的阉割版,只返回报文首部,不返回报文主体。 -
OPTIONS
:查询针对请求URI指定资源支持的方法。假若目标URI支持GET
,POST
,OPTION
,HEAD
,则响应报文中会出现:Allow:GET,POST,OPTION,HEAD
; -
TRACE
:让服务器端将请求通信环返回给客户端的方法。客户端与服务器之间可能存在若干个代理或是网关,通过TRACE
方法可以追踪请求报文所经过的路径,查询请求是怎样被修改(或是篡改)的,但因为TRACE方法容易引发跨站追踪,所以也不常用。 -
CONNECT
:要求在与代理服务器通信时建立隧道,常与SSL或TLS一起包装使用,也就是HTTPS。
HTTP状态码
在所有的响应报文首部会借助状态码来告诉服务端对本次请求的处理结果,状态码以3位数字和原因短语构成。第一位数字代表了响应类别,第二位,第三位只有占位的意义:
状态码一共大概有60多种,但常用的大概只有14种,接下来依次介绍:
-
200 OK
:这是最希望看到的结果,表示服务器已经成功处理了客户端的请求并作出了正确的响应。 -
204 Not Content
:表示服务器已成功处理客户端的请求,但响应报文中不含实体的主体部分,也不允许返回实体主体。 -
206 Partial Content
:表示客户端进行了范围请求,服务器也成功的执行了这部分的GET请求。响应报文中包含了Content-Range来表明返回实体主体的范围。 -
301 Moved Permanently
:永久重定向,表明该资源已经被分配了新的URI,输入老URI会自动跳转至新URI。 -
302 Found
:临时重定向,也表明该资源被分配了新的URI,但新的URI也可能发生改变。 -
303 See Other
:与302一样,但多了一个限定条件,要求客户端能用GET方法来获取资源。
PS:实际上301,302,303响应状态码返回时,所有的浏览器都会将POST改为GET,并删除请求报文的主体。 -
304 Not Modified
: 该状态码表示客户端附带条件请求(带有IF的首部字段)时,未满足条件时,服务器却允许访问资源的情况。304状态码返回时,不包含任何实体主体部分。当我们浏览缓存时,常常看到304状态码。 -
400 Bad Request
:请求报文中存在语法错误。 -
401 Unauthorized·
:表示该请求需要通过HTTP认证(BASIC认证或DIGEST认证)。 -
403 Forbidden
:表示请求被服务器拒绝,往往是客户端所在IP地址未授权。 -
404 Not Found
:表明在服务器上找不到这个资源,或服务器拒绝请求不想说明理由时也能使用。 -
500 Internal Server Error
:服务器在执行请求时出错,可能是服务器语法错误。 -
503 Service Unavailable
:服务器暂时处于超负载(挂了)或正在维护中,暂时无法执行请求。