[toc]
# HTTP 消息结构
* 基于
HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。
* HTTP"客户端" 请求者
一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。
* HTTP"服务器" 反馈者
一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。
* URL作用
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。
* HTTP协议的报文格式
客户端发送的HTTP报文,我们称为请求链;中介服务器或Web服务器发送的HTTP报文,称为响应链。两种报文都遵循以下格式:
* 一般开始行,即请求报文的请求行和应答报文的状态行;
* 总头;
* 报文头;
* 一个空行;
* 报文体
* 示例结构
![](/upload/attach/202011/202011241524_MEHQV3A3XTKV5F4.png)
## 客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部俗称报头(header)、空行和请求数据四个部分组成,如下图所示:
![](/upload/attach/202011/202011241533_RSZBK6EAZWX6U7P.png)
* 请求行:
```
POST /orgid/idtoken/conditional HTTP/1.1
[请求方法] [url] [版本] (空格其分割区分作用)
```
* 报头
```
Host :请求的资源在哪个主机的端口上
Connection:该请求支持长连接(heep_alive)
Content-Length:正文内容长度
Content-Type:数据类型
User-Agent:声明用户的操作系统和浏览器版本信息
Accent:发起了请求
Referer:当前页面是从哪个页面跳转过来的
Accept-Encoding:接受的编码
Accept-Language:接受的语言类型
Cookie:用于在客户端存储少量信息,通常用于实现会话(session)功能
```
* 空行
它的作用是通过一个空行,告诉服务器请求头部到此为止。
* 请求数据
注意:若方法字段是GET,则此项为空,没有数据
若方法字段是POST,则通常来说此处放置的就是要提交的数据
举例:比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。
## 服务器响应消息
HTTP响应也由四个部分组成,分别是:响应行、响应报头、空行和响应正文。
* 响应行
响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK
其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
* 响应头
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
**常见的响应头字段含义:**
```
Allow:服务器支持哪些请求方法(如GET、POST等)。
```
```
Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。
```
```
Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
```
```
Content- Type:表示后面的文档属于什么MIME类型。
```
```
Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。
```
```
Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。
```
```
Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
```
```
Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。
```
```
Refresh:告诉浏览器隔多久刷新一次,以秒计。
```
```
Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。
```
```
Set-Cookie:设置和页面关联的Cookie。
```
```
Transfer-Encoding:告诉浏览器数据的传送格式。
```
```
WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。
```
```
setContentType:设置Content-Type头。大多数Servlet都要用到这个方法。
```
```
setContentLength:设置Content-Length头。对于支持持久HTTP连接的浏览器来说,这个函数是很有用的。
```
```
addCookie:设置一个Cookie(Servlet API中没有setCookie方法,因为应答往往包含多个Set-Cookie头)。
```
```
插入代码
```
* 空行
它的作用是通过一个空行,告诉响应端响应头部到此为止。
* 响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。
# 参考资料
* 《HTTP请求/响应报文结构》
* 《HTTP教程》