HTTP协议的定义
这篇文章暂时不研究HTTP底层的TCP/IP的握手和挥手过程,只从表面的交互流程分析HTTP协议。
HTTP英文全称是Hypertext Transfer Protpcol,也就是超文本传输协议。HTTP是一个标准,定义了Web客户端如何与服务器对话以及数据如何从服务器传回到客户端。在日常开发和使用过程中,HTTP经常被认为是一种用于传输HTML文件和文件中内嵌的图片的协议或者手段,实际上HTTP是一种通用的网络数据传输格式,它的传输内容不仅仅局限于HTML文件或者图片,也可以用来传输Microsoft Word文档甚至是Windows的exe文件等等,所有可以用字节序列表示的数据都可以使用HTTP进行传输。
HTTP通过TCP/IP进行数据传输,如果忽略底层的TCP协议的握手和挥手的细节,对于从客户端到服务器的每一个请求和请求的响应,在HTTP1.0有下面几个步骤:
- 1、默认情况下,客户端在端口80开启与服务器的一个TCP连接,当然也可以指定其他的端口。
- 2、客户端向服务器发送消息,请求指定路径上的资源。一个HTTP请求包括一个首部,可选项包括一个空行和这次请求的数据。
- 3、服务器向客户端发送响应。响应以响应码开头,接着是包含元数据的首部,可选项包括一个空行以及所请求的文档数据或者错误信息。
- 4、服务器关闭TPC连接。
在HTTP1.1(目前最常用的就是HTTP1.1)以及以后的HTTP版本中,可以通过一个TCP连接连续发送多个请求和接收多个响应。也就是说,上面的1和4步骤中间的2和3步骤可以反复执行多次。另外,HTTP1.1中,请求数据和响应数据可以分块发送,提高了扩展性。
HTTP请求方法
HTTP中定义了多种请求方法,用于标识当次请求需要完成什么类型的操作,常用的HTTP请求方法有GET、HEAD、PUT、POST、PATCH、TRACE、OPTIONS、DELETE。
上面说到的"是否安全"的选项是"是",意味着使用该种HTTP请求方法不会发生任何数据的修改或者更新动作,也就是请求多次也不会影响到资源的状态。如果"是否幂等"的选项是"是",意味着使用该HTTP请求方法请求多次HTTP调用,无论调用多少次,请求结果或者资源的状态是一样的(可以理解为只有首次调用是真正修改了资源的状态,从第二次调用开始后面的调用只获取到第一次调用的结果)。HTTP方法的安全性和幂等性是我们在设计HTTP接口时候需要重点考虑的两个因素。
值得注意的是:上面提到的POST和PUT方法的功能可以理解为相同的,两者的主要区别在于POST不是幂等的,而PUT是幂等的。在目前的Web开发中,POST方法已经被滥用,一般很少人会使用PUT,除非是推崇RESTFUL风格编程。PUT方法和PATCH方法的功能类似,都是用客户端请求的数据去替换掉服务器中指定文档中的内容,不过PUT方法是全部替换,而PATCH方法是部分替换。
PS:上面的方法只是HTTP协议中的请求方法的一些规范,没有硬性规定一定要遵循。
常见的HTTP状态码
JDK中常见的HTTP状态码可以在类java.net.HttpURLConnection中找到,总结一下如下: