Java网络编程-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请求方法 描述 是否安全 是否幂等
GET   通常用于请求服务器获取某个资源      
HEAD   类似于GET,但是响应结果中不包含响应体,只包含协议信息和首部,通常用于测试资源是否存在或者是否被修改     -  
POST   客户端向服务器提交数据(支持HTML的表单数据),可能会导致新的资源的建立或者已有资源的修改      
PUT   从客户端向服务器传送的数据取代指定的文档的内容(全部取代)      
PATCH   客户端向服务器传送的数据取代指定的文档的内容(部分取代)      
TRACE   回显客户端请求服务器的原始请求报文,用于"回环"诊断     -  
OPTIONS   请求服务器获取服务器支持的各种功能,可以询问服务器支持什么类型的HTTP方法,一般用于性能测试     -  
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中找到,总结一下如下:

状态码 状态码消息 含义 HttpURLConnection中的常量 简单描述
1xx   -   信息状态码。   -   不常见,暂不考虑  
100   Continue   服务器准备接受请求主体,客户端发送请求主体;这允许客户端在请求发送大量数据之前询问服务器是否接受请求。   -   不常见,暂不考虑  
101   Switching Protocols   服务器接受客户端在Upgrade首部字段中要求改变应用的协议请求,如从HTTP转换为WebSockets。   -   不常见,暂不考虑  
2xx   -   表示请求成功。   -   -  
200   OK   最常见的响应码,代表请求成功。如果请求方法是GET或者POST,所请求的数据与正常的首部都包含在响应体中。如果请求方法是HEAD,则只包含首部信息。   HTTP_OK   处理请求成功  
201   Created   服务器已经在响应体中指定的URL创建了对应的资源。客户端现在应当尝试加载该URL。这个响应码只在响应POST请求时发送。   HTTP_CREATED   创建成功  
202   Accepted   表示请求已经被处理,但是处理尚未结束,所以不会返回任何响应数据。   HTTP_ACCEPTED   接受请求  
203   Non-Authoritative Information   由缓存代理或者其他本地源返回资源的表示,不能保证是最新的。   HTTP_NOT_AUTHORITATIVE   无权威的返回结果  
204   No Content   服务器已经成功处理了该请求,但是没有信息发回给客户端。一般是由于服务器上的表单处理逻辑的问题,只接收数据不返回数据。   HTTP_NO_CONTENT   无返回内容  
205   Reset Content   服务器已经成功处理了该请求,但是没有信息发回给客户端。客户端应该清除发送请求的表单信息。   HTTP_RESET   重置内容  
206   Partial Content   服务器返回客户端请求的资源的部分内容,而不是整个文档。   HTTP_PARTIAL   部分内容  
3xx   -   重定向。   -   -  
300   Multiple Choices   服务器为所请求的文档提供一组不同的表示。   HTTP_MULT_CHOICE   多重选择  
301   Moved Permanently   资源已经移动到一个新的URL。客户端应当自动加载这个URL的资源。   HTTP_MOVE_PERM   永久移动  
302   Moved Temporarity   资源暂时移动到一个新的URL,但其位置在不久的将来还会再次改变。   HTTP_MOVE_TEMP   临时移动  
4xx   -   客户端错误   -   -  
400   Bad Request   客户端向服务器发出的请求使用了不正确的语法。   HTTP_BAD_REQUEST   错误请求  
401   Unauthorized   访问这个URL需要身份验证,一般是用户名和口令。   HTTP_UNAUTHORIZED   未授权  
403   Forbidden   服务器理解请求,但是有意拒绝进行处理。   HTTP_FORBIDDEN   禁止访问  
404   Not Found   最常见的错误响应,指示服务器找不到所请求的资源。   HTTP_NOT_FOUND   未找到资源  
405   Method Not Allowed   请求方法不支持用于请求指定的资源。   HTTP_BAD_METHOD   方法禁用  
406   Not Acceptable   所请求的资源不能以客户端希望的格式提供,客户端期望的格式由请求HTTP首部Accept字段指定。   HTTP_NOT_ACCEPTABLE   不接受  
5xx   -   服务端错误   -   -  
500   Internale Server Error   服务器内部异常。   HTTP_SERVER_ERROR   服务器异常  
501   Not Implemented   服务器不具备完成请求的功能。   HTTP_NOT_IMPLEMENTED   尚未实现  
502   Bad Gateway   服务器作为网关或代理,从上游服务器收到无效响应。   HTTP_BAD_GATEWAY   错误网关  
503   Service Unavailable   服务器暂时无法处理请求,可能是超负荷或者维护等原因。   HTTP_UNAVAILABLE   服务不可用  

简单概括如下:

响应码100-199表示一个提供信息的响应。

响应码200-299表示请求成功。

响应码300-399表示重定向。

响应码400-499表示一个客户端引发的错误。

响应码500-599表示一个服务器引发的错误。

常见的HTTP首部

下面简单列举一些比较常用的首部以及它们的作用。

User-Agent

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyxzd.html