HTTP协议几乎是JAVA开发人员人人都要掌握的知识点,本文主要介绍HTTP协议的由来、工作原理及方法。
HTTP协议是超文本传输协议,是应用层上的一种请求/响应式的文本协议,实现客户端与服务器之间的通信,是www发布信息的主要协议。
1、 HTTP的由来
在一个网络中,客户端与服务器之间的成功通信需要解决以下三个问题:
1、 客户端如何知道所求内容的位置?
2、 当客户端知道所求内容的位置后,如何获取所求的内容?
3、 所求内容以何种形式被客户端所识别?
对于WEB应用来说,回答以上三个问题分别需要用到三个技术,分别为:统一资源定位符URL,超文本传输协议HTTP,超文本标记语言HTML。HTTP协议使用URL来定位WEB服务器的资源,客户端通过DNS服务器将URL中的域名解析为IP地址,根据IP地址向WEB服务器发送HTTP请求后,服务器会回应一个HTTP应答。HTTP应答内容是以HTML的格式被客户端所识别。
2、 HTTP的工作原理
网络中所有的数据都是通过TCP/IP进行传播的,作为应用层的HTTP协议也不例外。
HTTP是基于传输层的TCP进行传输的,TCP传输时需要建立一个端到端的连接,因此HTTP在开始传输之前需要通过三次握手建立一个TCP连接。TCP连接建立之后,HTTP就可以进行传输了,在HTTP传输过程中不能断开TCP连接。
这个过程可以概括为以下几步:
① WEB客户端与WEB服务器建立TCP连接;
② WEB客户端通过浏览器向WEB服务器80端口发送HTTP请求;
③ 如果WEB服务器允许访问,则返回连接确认,双方建立HTTP连接;
④ WEB客户端发送HTTP页面请求;
⑤ WEB服务器寻找该HTTP文件,如果找到则返回该文件的超文本。WEB客户端的浏览器对接收到的超文本进行解析,翻译成格式化的页面显示给用户;
⑥ WEB服务器发送完HTTP内容后,断开HTTP连接;
⑦ 双方断开TCP连接。
3、 HTTP方法
接下来介绍HTTP请求和响应的具体内容。
3.1 HTTP请求(HTTP Request)
所谓的HTTP请求就是客户端向服务器发送信息,这个信息包含以下三个部分:
1. 请求行
2. HTTP头
3. 内容
请求行:
一个典型的请求行,如:
HTTP请求行的写法是固定的,第一部分是请求方法,第二部分是请求网址,第三部分是HTTP版本。
HTTP头:HTTP头有三种形式,分别是请求头,普通头,实体头。由于GET请求方法不含内容实体,因此不会有实体头。
内容:
这一部分只有在POST请求中存在,因为GET请求不包含任何实体。
如下是一个具体的POST请求的三部分。
HTTP请求方法
HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。但是在Internet应用中,最常用的方法是GET和POST。
GET 从指定的服务器中获取数据
POST 提交数据给指定的服务器处理
HEAD HEAD与GET类似,但是请求只在客户程序和服务器之间进行交流,而不会返回具体的文档。当使用GET和POST方法时,服务器最后都将结果文档返回给客户程序,浏览器刷新显示。而HEAD请求则不同,它仅仅交流一些内部数据,这些数据不会影响浏览的过程。因此HEAD方法通常不单独使用,而是和其他的请求方法一起起到辅助作用。一些搜寻引擎使用的自动搜索机器人使用这个方法来获得网页的标志信息,或者进行安全认证时,使用这个方法来传递认证信息。
PUT 上传指定URL的描述,用于将网页放置到正确位置。
DELETE 请求服务器删除 资源。
TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。
GET和POST的区别
本质区别:GET一般用户获取数据资源,POST用于更新数据资源。
- 1、get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到,如/test/demo_form.jsp?name1=value1&name2=value2。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。如
POST /test/demo_form.jsp HTTP/1.1Host: w3schools.comname1=value1&name2=value2
-
2、对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。两种方式的参数都可以用Request来获得。
-
3、get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
-
4、get安全性非常低,post安全性较高。
3.2 HTTP响应(HTTP Response)
当Web服务器收到客户端的HTTP请求之后,会根据请求的信息做某些处理,然后作出对应的HTTP响应。HTTP响应和请求类似,也有三部分信息组成:
1、 状态行
2、 HTTP头
3、 返回内容
状态行
一个典型的状态行,如:
常见的状态码需明白它们的含义:
1xx(临时响应)
2xx(请求成功)
200 OK
201 新的资源已建立(POST)
3xx(重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
400 错误的请求
404 找不到资源
5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500 内部服务器产错
503 内部服务器暂时出错
HTTP头:
HTTP头包含三种形式的头:响应头,普通头,实体头。
返回内容:
这部分响应的内容可以是图片,也可以是一个HTML,如下图所示,上图是一个HTML格式的,下图是一个图片形式的:
响应内容类型可以从HTTP头中的Content-Type这一项看出。
4、 状态保持
HTTP协议是无状态的协议。所谓无状态就是指对于接收HTTP请求的服务器来说,并不知道每次请求来自同一客户端还是不同的客户端,对服务器来说每次请求都是一样的。
可以通过一些额外的手段来记录状态:
1、通过Cookies保持状态
Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
2、通过表单保持状态
3、通过QueryString保持状态
这个原理和上述两种状态保持方法原理是一样的,QueryString通过将信息保存在所请求地址的末尾来向服务器传送信息,通常和表单结合使用。
5、HTTP的长连接和短连接
在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
从 HTTP/1.1起,默认使用长连接,用以保持连接特性,既不发RST包,不四次挥手。使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive
|
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
HTTP的keep-alive和TCP的keep-alive的区别: