Java EE架构设计与开发实践
上QQ阅读APP看书,第一时间看更新

2.2 HTTP协议

HTTP(HyperText Transfer Protocol)协议即超文本传输协议。超文本传输协议是万维网(World Wide Web)上应用最为广泛的一种网络协议,是一个属于应用层的面向对象的协议,适用于分布式超媒体信息系统。HTTP主要用在客户端(浏览器)和Web服务器之间进行通信。客户端(浏览器)和Web服务器之间要进行通信,首先使用可靠的TCP连接(默认端口为80),然后浏览器要先向服务器发送请求信息,服务器在接收到请求信息后做出响应,返回相应的信息,浏览器接收到来自服务器的响应信息后,对这些数据进行解释执行。所以HTTP可以分为两部分:HTTP请求和HTTP响应。

2.2.1 HTTP方法的请求格式

HTTP请求格式如下:

        <request-line>
        <headers>
        <blank line>
        [<request-body>]

在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个头部(header)小节,用来说明服务器要使用的附加信息,例如声明浏览器所用语言、请求正文的长度等。在头部之后是一个空行,指示头部结束。在此之后可以添加任意的其他数据,称之为主体(body),其中可以包含客户提交的查询字符串信息。

在HTTP请求中,定义了大量的请求类型,其中GET请求和POST请求是最主要的。只要在Web浏览器中输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回资源(也就是对网页的访问)。而POST请求在请求主体重为服务器提供了一些附加的信息。通常,当填写一个在线表单并提交时,这些填入的数据将以POST请求的方式发送给服务器。

2.2.2 HTTP方法的响应格式

HTTP服务器接到请求后,经过处理会给予相应的响应信息,其格式与HTTP请求相似:

        <status-line>
        <headers>
        <blank line>
        [<request-body>]

在HTTP响应中与请求唯一的区别在于第一行中用状态信息代替了请求信息,状态行(status line)通过提供一个状态码来说明所请求的资源情况。在响应信息的头部也包含很多信息,如服务器类型、日期时间、内容类型和长度等。在头部之后同样需要用一个空行指示头部结束。再接下来就是服务器返回的内容。

2.2.3 HTTP协议主要特点

浏览器的每次请求都要求建立一次单独的连接,在处理完每一次的请求后,就自动释放连接。

HTTP协议的主要特点可概括如下:

❑ 支持客户端/服务器模式。

❑ 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

❑ 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

❑ 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

❑ 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则必须重传,这样可能导致每次连接传送的数据量较大。另外,在服务器不需要先前信息时应答就较快。

2.2.4 GET/POST方法的比较

GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。

POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。

GET/POST方法有以下区别:

❑ 在客户端,Get方式通过URL提交数据,数据在URL中可以看到;POST方式中,数据放置在HTML HEADER内提交。

❑ GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

❑ 安全性问题。使用Get的时候,参数会显示在地址栏上,而Post不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用post为好。

❑ 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一URL的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,它可以确信从自身的角度来看没有改变资源。例如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST请求就不那么轻松了。POST表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过POST请求实现,因为在注解提交之后站点已经不同了(比如文章下面出现一条注解)。