博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HttpClient4.5中文教程】七. 异常处理
阅读量:4291 次
发布时间:2019-05-27

本文共 1605 字,大约阅读时间需要 5 分钟。

HttpClient 能够抛出两种类型的异常:

1)java.io.IOException :在 I/O 失败时,如socket连接超时或被重置的异常;

2)HttpException:标志 HTTP 请求失败的信号,如违反 HTTP 协议。通常 I/O 错误被认为是非致命的和可以恢复的,而 HTTP 协议错误,则被认为是致命的而且是不能自动恢复的。请注意HttpClient实现了可抛出异常HttpExceptions为ClientProtocolException,也是 java.io.IOException的子类。这使HttpClient使用者能够在一个单一的catch子句中处理 IOException HttpException

1. HTTP传输安全

要理解 HTTP 协议并不是对所有类型的应用程序都适合的,这一点很重要。 HTTP 是一个
简单的面向请求/响应的协议,最初被设计用来支持取回静态或动态生成的内容。它从未打算支持事务性操作。比如,如果成功收到和处理请求, HTTP 服务器将不会考虑是否只完成了部分请求,它仅生成一个响应并发送一个状态码到客户端。如果客户端因为读取超时,请求取消或系统崩溃导致接收响应实体失败时,服务器不会试图回滚事务。如果客户端决定
决定发送相同的请求,那么服务器将不可避免地多次执行这个相同的事务。在一些情况下,这会导致应用数据污染或者应用程序状态不一致。
尽管 HTTP 从来都没有被设计来支持事务性处理,但它仍然能被用作于一个对目标应用提供被确定状态传输协议。要保证 HTTP 传输层的安全,系统必须保证 HTTP 方法在应用层的幂等性。

2.幂等方法

HTTP/1.1 详细地定义了幂等的方法:
[Methods can also have the property of "idempotence" in that (aside from error or expiration issues)the side-effects of N > 0 identical requests is the same as for a single request]
换句话说,应用程序应该确保-它是准备着的来处理相同方法的不同执行含义。这是可以达到的,比如,通过提供一个唯一的事务 ID 和避免执行相同逻辑操作的方法。
请注意,这个问题对于 HttpClient 是不明确的。基于应用的浏览器确切的说也受到了相同的问题:与非幂等的 HTTP方法有关。
HttpClient 中非内含实体方法,比如GET和HEAD 是幂等的,而内含实体方法,比如POST和PUT则不是幂等的。

3.自动的异常回复

默认情况下, HttpClient 会试图自动从 I/O 异常中恢复。默认的自动恢复机制仅可以对几个被认为是安全的异常起作用。
 #HttpClient 不会尝试从任意逻辑或 HTTP 协议的异常(原文为errors)中恢复(那些是从 HttpException 类中派生出的异常类)。
 #HttpClient 将会自动重新执行那些假设是幂等的方法。

 #HttpClient 将会自动重新执行那些由于传输异常导致的失败,而 HTTP 请求仍然被传送到目标服务器的方法。(也就是请求没有完整的被传送到服务器)

4.请求尝试处理器(Request retry handler)

 为了能够使用自定义异常的恢复机制,你必须提供一个HttpRequestRetryHandler接口的实现。

请注意你可以使用StandardHttpRequestRetryHandler代替默认使用的,以便处理那些被RFC-2616定义为幂等的并且能够安全的重试的请求方法。方法有:GET, HEAD, PUT, DELETE, OPTIONS, and TRACE。

你可能感兴趣的文章
netty源码分析之-处理器详解(9)
查看>>
javascript原型对象存在的问题(3)
查看>>
javascript原型继承(1)
查看>>
javascript原型继承-实现extjs底层继承(2)
查看>>
javascript设计模式-建立接口的方式(1)
查看>>
javascript设计模式-单体singleton模式(2)
查看>>
javascript设计模式-链式编程(3)
查看>>
大型高并发与高可用缓存架构总结
查看>>
javascript设计模式-工厂模式(4)
查看>>
javascript设计模式-组合模式(6)
查看>>
javascript设计模式-门面模式(7)
查看>>
javascript设计模式-享元模式(10)
查看>>
javascript设计模式-代理模式(11)
查看>>
Executor相关源码分析
查看>>
react之setState解析
查看>>
elasticsearch7.3版本已经不需要额外安装中文分词插件了
查看>>
【重大好消息】elasticsearch 7.3版本已经可以免费使用x-pack就可以设置账号和密码了,让你的数据不再裸奔
查看>>
解决使用logstash中jdbc导入mysql中的数据到elasticsearch中tinyint类型被转成布尔型的问题的方法
查看>>
elasticsearch7.3版本环境搭建(一)elasticsearch安装和配置
查看>>
SEO基本功:站内优化的一些基本手段
查看>>