知识点
- 清楚 HTTP 请求与响应的整个过程
- 熟悉请求信息和响应信息中的一些细节比如请求的方式,响应状态等
参考文章
HTTP 请求和响应过程
Web
浏览器与 Web
服务器之间完成的 7 个步骤
1.建立 TCP 连接
在 HTTP
工作开始之前, Web
浏览器首先要通过网络与 Web 服务器建立连接, 该连接是通过 TCP
协议来完成的, 该协议与 IP 协议共同构建 Internet, 即著名的 TCP/IP
协议族, 因此 Internet 又被称作是TCP/IP 网络.
HTTP
是比 TCP
更高层次的应用层协议, 根据规则, 只有低层协议建立之后才能进行更高层协议的连接, 因此, 首先要建立 TCP 连接。
2.Web 浏览器向 Web 服务器发送请求命令
一旦建立了 TCP 连接,Web 浏览器就会向 Web 服务器发送请求命令 。
3.Web 浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向 Web 服务器发送一些别的信息,这些信息用来描述浏览器自己。之后浏览器发送一空白行来通知服务器,表示它已经结束了该头信息的发送。若是 post
请求,还会在发送完请求头信息之后发送请求体。
4.Web 服务器应答
客户端向服务器发出请求后, 服务器会向客户端作出应答。应答的第一部分是协议的版本号和应答状态码 如HTTP/1.1 200 OK
。
5.Web 服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。最后以一个空白行来表示头信息发送到此结束。
6.Web 服务器向浏览器发送数据
Web 服务器向浏览器发送头信息后,它就以 Content-Type
应答头信息所描述的格式发送用户所请求的实际数据。
7.Web服务器关闭TCP连接
一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接。如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
,TCP 连接在发送后将仍然保持打开状态。于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTP 请求信息
上图是通过 Charles 抓包工具的一个截图,可以清楚看出 HTTP 请求的整个过程。关于这个工具的使用可以查阅这篇文章 Mac版抓包工具Charles使用。
HTTP 请求信息由 3 部分组成:
请求方法(GET/POST)、URI、协议/版本
请求头(Request Header)
请求正文
请求方法
请求方法 | 内容 |
---|---|
GET | 请求获取由 Request-URI 所标识的资源 |
POST | 在 Request-URI 所标识的资源后附加新的数据 |
HEAD | 请求获取由 Request-URI 所标识的资源的响应消息报头 |
OPTIONS | 请求查询服务器的性能,或查询与资源相关的选项和需求 |
PUT | 请求服务器存储一个资源,并用 Request-URI 作为其标识 |
DELETE | 请求服务器删除由 Request-URI 所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
在 Internet 应用中,最常用的方法是 GET 和 POST。
请求头
请求头 | 内容 |
---|---|
Content-Type | 是返回消息中非常重要的内容,表示后面的文档属于什么MIME类型。 |
Accept-Encoding | 浏览器能够进行解码的数据编码方式,比如 gzip 。Servlet 能够向支持 gzip 的浏览器返回经 gzip 编码的 HTML 页面。许多情形下这可以减少 5 到 10 倍的下载时间 |
Connection | 表示是否需要持久连接。如果 Servlet 看到这里的值为 Keep- Alive ,或者看到请求使用的是 HTTP1.1 (HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个 Content-Length 头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小 |
User-Agent | 浏览器类型,如果 Servlet 返回的内容与浏览器类型有关则该值非常有用 |
Content-Length | 表示请求消息正文的长度 |
Cookie | 这是最重要的请求头信息之一 |
… | … |
常见的MIME类型
text/html
: HTML 格式text/plain
:纯文本格式text/xml
: XML 格式image/gif
:gif 图片格式image/jpeg
:jpg 图片格式image/png
:png 图片格式
以 application 开头的媒体格式类型
application/xhtml+xml
:XHTML 格式application/xml
: XML 数据格式application/atom+xml
:Atom XML 聚合格式application/json
: JSON 数据格式application/pdf
:PDF 格式application/msword
: Word 文档格式application/octet-stream
: 二进制流数据(如常见的文件下载)application/x-www-form-urlencoded
:<form encType=””>
中默认的 encType,form 表单数据被编码为key/value
格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data
: 需要在表单中进行文件上传时,就需要使用该格式。
请求正文
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。
HTTP 响应格式
HTTP 响应与 HTTP 请求相似,HTTP 响应也由 3 个部分构成。
状态行
响应头(Response Header)
响应正文
状态行
HTTP/1.1 200 OK
,由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。
状态代码由 3 位数字组成,表示请求是否被理解或被满足。
状态描述给出了关于状态代码的简短的文字描述。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。第一个数字有五种可能的取值:
1xx
: 指示信息,表示请求已接收,继续处理。2xx
: 成功,表示请求已经被成功接收、理解、接受。3xx
: 重定向,要完成请求必须进行更进一步的操作。4xx
: 客户端错误,请求有语法错误或请求无法实现。5xx
: 服务器端错误,服务器未能实现合法的请求。
状态代码 | 状态描述 | 说明 |
---|---|---|
200 | OK | 客户端请求成功 |
400 | Bad Request | 由于客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthonzed | 请求未经授权。这个状态代码必须和 WWW-Authenticate 报头域一起使用 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 |
404 | Not Found | 请求的资源不存在,例如,输入了错误的URL |
500 | Internal Server Error | 服务器发生不可预期的错误,导致无法完成客户端的请求 |
503 | Service Unavailable | 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常 |
响应头
响应头可能包括:
Location
Location
响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回 Location 响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源。当我们在 JSP
中使用重定向语句的时候,服务器端向客户端发回的响应报头中,就会有 Location 响应报头域。
Content-Language
Content-Language
实体报头域描述了资源所用的自然语言。Content-Language 允许用户遵照自身的首选语言来识别和区分实体。如果没有指定 Content-Language 报头域,那么实体内容将提供给所有语言的阅读者。
Content-Length
Content-Length
实体报头域用于指明正文的长度,以字节方式存储的十进制数字来表示,也就是一个数字字符占一个字节,用其对应的 ASCII
码存储传输。要注意的是:这个长度仅仅是表示实体正文的长度,没有包括实体报头的长度。
Content-Type
Content-Type
实体报头域用于指明发送给接收者的实体正文的媒体类型。