Java Web应用开发
上QQ阅读APP看书,第一时间看更新

1.2 HTTP

HTTP是一个应用层协议,主要用于实现万维网上的各种连接,它使用传输控制协议(TCP, Transmission Control Protocol)连接进行可靠的数据传送。本节将对HTTP进行简要的介绍,使读者理解Web开发所要解决的基本问题。

【提出问题】

怎样标识分布在整个因特网上的资源?客户端发出的请求包含哪些信息?服务器又会返回什么响应信息?

【知识储备】

1.2.1 HTTP概述

超文本传输协议(HTTP,Hyper Text Transfer Protocol)定义了浏览器向服务器请求文档、服务器将文档传送给浏览器的通信规则。HTTP 允许将超文本标记语言(HTML,Hyper Text Markup Language)文档从服务器端传送到客户端,是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

HTTP主要由请求和响应构成,如图1-2所示。客户端在和服务器建立连接后可以发起请求,请求通常会包含请求方式和资源路径,每种请求方式都规定了客户端与服务器联系的具体形式。服务器接收到请求后会做出响应,可以根据请求找到相应的资源进行处理:若为静态资源,则直接将资源的内容发送给客户端;若为动态内容和程序,则进行执行,把处理后的结果以HTML的形式发送给客户端。

图1-2 HTTP的请求-响应模型

本书中使用的是HTTP 1.1版本。

提示

HTTP与TCP/IP

TCP/IP(传输控制协议/互联网协议)是不同的通信协议的大集合,浏览器和服务器均使用其来连接因特网。TCP/IP自下而上将整个通信网络的功能分成7层。

HTTP是基于TCP/IP的应用层协议,它的实现建立在下层协议的服务之上。

HTTP的请求/响应过程如图1-3所示。

图1-3 HTTP请求/响应过程

(1)客户端连接到Web服务器

一个HTTP客户端通常是网页浏览器,可以与Web服务器的HTTP端口(默认为80)建立一个TCP连接。

(2)通过建立起的连接向服务器发送HTTP请求

通过TCP连接,客户端向Web服务器发送一个文本的请求报文,请求获取某个Web页面。

(3)服务器接收请求并返回HTTP响应

Web服务器解析请求,定位请求资源,将资源复本通过该连接发送给客户端。

(4)客户端解析HTML内容

客户端解析返回的响应报文。首先解析状态行,通过状态码查看请求是否成功。然后解析响应消息头,响应消息头包含服务器名称、页面资源的内容长度等信息。最后读取响应数据,根据HTML的语法对其进行格式化,在浏览器窗口中显示资源页面。

(5)释放TCP连接,通信的双方断开所建立的连接

在传输若干个请求/响应后,当客户端发出关闭连接的请求时,TCP连接关闭。

1.2.2 URL格式

如何根据客户端的请求找到对应的资源或程序?这是服务器开发首先要解决的问题。在万维网上,每一个资源都有统一且唯一的地址,即我们常说的网页地址,这个地址就是统一资源定位符(URL,Uniform Resource Locator)。

URL主要由3个部分组成:资源类型、存放资源的主机域名和资源存放路径,如图1-4所示。

图1-4 URL格式与组成

URL的语法格式如下。

schema://host[:port#]/path/.../[?query-string][#anchor]

(1)schema:指定使用的协议,如HTTP、HTTPS、FTP。

(2)host:服务器的lP地址或者域名,如www.ptpress.com.cn。

(3)port:与服务器通信的端口,如果省略 port,则使用协议的默认端口。例如,HTTP 默认的端口号是80,如果使用了其他的端口,则必须指明。

(4)path:访问资源的路径,是由0、1或由多个“/”符号隔开的字符串组成,一般用来表示主机上的一个目录或文件地址。如果省略path,则文档必须位于网站的根目录中。

(5)query-string(查询字符串):可选,是发送给HTTP服务器的数据,用于给动态网页传递参数。

(6)anchor(锚):页内显示的锚点。例如,如果一个网页中有多个名词解释,可使用 anchor直接定位到某一名词解释。

下面是一个完整的URL地址示例。

https://www.ptpress.com.cn/shopping/index

1.2.3 HTTP报文格式

HTTP报文是客户端和服务器相互通信时发送的数据块。

HTTP报文有两类。

(1)请求报文:从客户端向服务器发送请求的报文。

(2)响应报文:从服务器向客户端回答请求的报文。

下面通过图1-5来了解客户端和服务器在相互通信时对HTTP报文的处理过程。

图1-5 HTTP请求/响应报文

首先客户端向服务器发送 HTTP 请求报文,请求报文(第一部分)的第一行说明了请求方式(GET)、使用的通信协议(HTTP)和版本号(1.1),这是HTTP请求行。其余部分采用键/值对的形式发送,包含了URL等信息,我们称之为请求头。

服务器在接收到信息后,根据URL找到图片文件,并将其发送给客户端。HTTP响应报文(第二部分)的第一行说明了采用的是协议HTTP、版本号为1.1;“200 OK”表示本次请求正常处理,这是 HTTP 响应状态行;其余部分称为响应头,服务器可以在这部分向客户端传递附加信息,例如,Content-Type用来说明资源的类型,Content-Length用来指明资源的长度。

第三部分内容是响应体,这里服务器向客户端响应的是一张图片。客户端在接收到响应报文后,将响应体的内容呈现给用户。

通过以上过程的描述可以发现,HTTP请求报文主要由请求行、请求头和请求体组成,如图1-6所示。

图1-6 HTTP请求报文的组成

(1)请求行。位于请求报文的第一行,对报文进行描述,由请求方法、资源路径和协议版本组成。请求方法包括GET、POST等,它告诉服务器要执行怎样的操作。资源路径是指服务器根目录下的相对目录。

(2)请求头。由键/值对组成,每行一对,键和值用冒号“:”(英文)分隔,可以有多行键/值对,也可以不使用。请求头用于向服务器传递附加信息,如请求正文的长度、浏览器的类型等。

(3)请求体。包含请求数据。若采用GET方式,则没有请求体;若采用POST方式,则包含请求体。POST方式常用于需要客户填写表单的场合,用户数据将作为请求体发送给服务器。

HTTP响应报文主要由状态行、响应头和响应体组成。

(1)状态行。位于响应报文的第一行,由 HTTP 版本号、状态码和状态消息组成。状态码反映了服务器对客户端请求的响应状态,可以表示请求是否被理解、满足。状态码由3位数字组成,其中首位数字规定了响应状态的类别。表1-1列举了5种响应状态的类别及状态码首位取值规则。

表1-1 状态码及响应状态的类别

其中比较常见的几个状态码的含义如下。

① 200(成功):表示客户端的请求成功,请求所希望的响应头、数据体将在本响应消息中返回。

② 301(永久移动):指出请求的资源已经被移动到新的URL,响应信息会包含新的URL,客户端会自动定向到新的URL。

③ 404(找不到):服务器无法找到客户端请求的资源。

④ 500(服务器内部错误):服务器遇到错误,无法处理请求。

(2)响应头。与请求头类似,是一个键/值对的列表,为响应报文添加一些附加信息。例如,被请求资源需要的认证方式、页面资源的最后修改时间等。

(3)响应体。服务器返回给客户端的文件、数据等。如果客户端请求的是网页,那么响应体就是HTML代码。

1.2.4 HTTP请求方法

HTTP请求方法规定了客户端操作服务器资源的方式,这有点儿像快递系统,如果要给远方的朋友送个礼物,我们可以选择顺丰、中通、邮政特快专递或者其他快递服务来完成这个工作。

1.常见的请求方法

HTTP发送请求时同样可以选择不同的请求方法,目前HTTP 1.1版本支持8种请求方法,如表1-2所示。

表1-2 HTTP请求方法

(1)GET方法

GET 方法是最常用的请求方法,通常用于请求服务器发送某个资源。当用户在浏览器地址栏中直接输入某个URL或单击网页上的一个超链接时,浏览器将采用GET方法发送请求。

GET 请求方法的特点是没有请求体。用户的请求参数将通过 URL 查询字符串进行传递。例如,在网页 https://www.ptpress.com.cn/的搜索栏中输入“爱国”,然后进行搜索,弹出页面的URL如下。

https://www.ptpress.com.cn/search?keyword=爱国&jc=

该地址中“?”后面的内容是参数信息,是由参数名和参数值组成的,中间使用“=”连接。如果有多个参数,那么参数之间使用“&”分隔。

(2)POST方法

POST 方法最初是用来向服务器输入数据的,通常用来向指定资源提交数据以处理请求,如提交表单数据、上传文件等。数据被包含在请求体中。POST 请求方法可能会导致新的资源的建立和/或已有资源的修改。

下面通过图1-7描述的某次用户登录操作来进一步了解POST请求过程。

图1-7 采用POST方法发送请求

首先通过Form表单输入用户名和密码,然后单击“提交”按钮,向服务器发送请求,输入的数据就会通过请求体的内容发送到服务器。在请求头中,Content-Type指定了请求体的内容为Form表单,同时将Form表单中的信息(un=admin&pw=123)封装在请求体中。这样服务器就可以获取该请求,并进行相应的处理,最后将处理后的结果以HTML的形式回送给浏览器。

一般来说,我们会使用GET方法来完成单纯的数据获取,而涉及提交数据方面的请求都使用POST方法来完成,因为POST方法传递的参数是隐藏在请求体中发送的,用户是看不到的,而GET方法的参数信息都会在URL栏明文显示。

(3)HEAD方法

HEAD方法与GET方法类似,但服务器在响应中只返回响应头信息,不会返回响应体内容,如图1-8所示。这就允许客户端在未获取实际资源的情况下通过对响应头信息进行检查,从而判断该请求资源的状态。也就是说,使用HEAD方法,可以在不获取资源的前提下,通过查看响应中的状态码来检查资源是否存在,或测试资源是否被修改。通常,该方法在Web应用开发中使用较少。

图1-8 采用HEAD方法发送请求

(4)PUT方法

与GET 方法从服务器读取文档相反,PUT 方法会向服务器写入文档,从客户端向服务器传送的数据将取代指定的文档的内容。有些发布系统允许用户创建Web页面,并使用PUT方法直接将其安装到服务器上。

(5)DELETE方法

DELETE方法的作用是通过URL删除指定的资源,具体请求过程为:浏览器通过DELETE方法通知服务器删除指定的资源,服务器接受请求后将文件删除,然后对客户端进行响应。但是一般情况下服务器不会执行真正的删除操作,而是为资源做一个删除标记。

(6)TRACE方法

客户端发起的请求可能要穿过防火墙、代理、网关或其他一些应用程序,每个中间节点都可能修改原始的HTTP请求。TRACE方法允许客户端在请求最终发送给服务器时,查看它的变化,具体请求过程为:TRACE请求在目标服务器端发起一个“回环”诊断,最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间HTTP应用程序组成的请求/响应链上原始报文是否以及如何被毁坏或修改。

(7)OPTlONS方法

OPTlONS方法会请求Web服务器告知浏览器其所支持的请求方法。返回服务器针对特定资源所支持的HTTP请求方法,也可以使用“*”向服务器询问它所支持的可用于所有资源的HTTP请求方法。

(8)CONNECT方法

CONNECT方法是HTTP 1.1协议预留的方法,当服务器为客户端和另一台远程服务器建立一条特殊的连接隧道时,Web服务器在中间充当了代理的角色。CONNECT方法通常用于安全套接层(SSL,Secure Sockets Layer)加密服务器的连接与非加密的HTTP代理服务器的通信。

2.请求重定向

有时我们会遇到这样一种情况,输入网址访问一个网站,网页在打开的过程中URL自动改变了,虽然最终仍然可以访问网站,但是地址栏中的地址已经不是最初输入的地址了,这种情况是发生了请求重定向,具体过程为:客户端向服务器发送请求,服务器接收该请求后返回包含需要重新访问的URL的响应消息,客户端再使用收到的新的URL发送第二次请求,最终访问到目标资源。这个过程就好比我们找甲广告公司设计名片,甲公司明确说明他们不会设计,并向我们推荐乙公司,最终我们找到乙公司设计好了名片。所以我们会对外宣称是乙公司设计的名片。

在请求重定向的过程中:

(1)客户端发出了两次请求;

(2)地址栏会发生改变;

(3)客户端清楚服务器地址改变的事实。

请求重定向一般是同时使用响应头和状态码实现的。浏览器向服务器发送GET请求,服务器接收该请求后向浏览器发送301代码,同时通过响应头中的location指定下一次要跳转的地址,浏览器接收到响应后查看到状态码为301,知道需要进一步细化请求,因此会向location 所指定的地址再一次发出请求,服务器继续对该请求进行处理,最终打开所需页面。

1.2.5 HTTP会话管理

回顾 HTTP 请求-响应的过程可以发现,服务器会对客户端的每次请求进行响应,但是并没有保存过程中产生的请求、响应数据,这意味着HTTP不会为了下次请求的需要而保存本次请求过程中传输的数据。这就带来一个问题,当有多个用户同时访问服务器时,服务器如何区分他们呢?例如,用户甲和用户乙同时浏览一个购物网站,用户甲想要购买一箱牛奶,用户乙想要购买一部手机,当他们进行商品结算时,服务器需要知道发起请求的用户的身份才能区分他们分别购买的是哪件商品。

为了识别不同的用户及为同一个用户提供持久的服务,服务器通常需要对用户的状态进行跟踪,这就需要用到会话技术。以日常生活中打电话为例,从拨通电话开始到挂断电话之间发生的一连串的你问我答的完整过程就是一次会话。再比如,王女士去某商场购物,从她进入商场开始,其间可能有过咨询商品详细信息、试衣服、将某商品买下来等多种行为,直到最后王女士走出商场为止,这一过程也可以称为一次会话。

在Web开发中,会话是指客户端和服务器在一段时间内发生的一系列请求和响应过程。例如,某用户登录一个论坛并发帖的整个过程、某用户在一个电子商务网站购物的完整过程,都是一个会话。

在会话技术中,主要使用Cookie和Session对象保存会话数据。Cookie对象将会话数据保存在客户端,这些会话数据用于服务器识别用户身份。Session对象将会话数据保存在服务器端,以在服务器上记录与用户对应的信息。

Cookie对象保存会话数据的实现机制如图 1-9 所示。当客户端第一次向服务器发出请求时,服务器发现用户没有带来用于会话的Cookie,响应时就会在HTTP响应头中增加字段Set-cookie,其中包含信息,如id=“34294”。客户端会把Cookie保存到本地,当用户再次向该服务器发送请求时,浏览器就会在请求头中将Cookie信息一同发送给服务器,如id=“34294”。通过这种方式,服务器就可以识别用户的身份,跟踪用户在该网站上的活动,并为该用户提供持久的服务。

图1-9 Cookie对象保存会话数据的实现机制

【梳理回顾】

本节介绍了HTTP的主要内容和Web开发需要解决的基本问题,其中HTTP报文格式、请求方法是学习的重点。