HttpClient异常处理手册

HttpClient异常处理手册

开源中国

开源中国

发表于 2014-08-26 19:44:06

异常处理 

HttpClient的使用者在执行HTPP方法(GET,PUT,DELETE等),可能遇到会两种主要类型的异常:

  • 传输异常
  • 协议异常

并不是所有的异常都会传播给HttpClient的用户。HttpClient内部使用的异常在下文中将会标记为内部使用

  • 传输异常
  • 协议异常
  • HTTP传输安全
  • 自动异常恢复
  • 自定义异常处理

传输异常 

传输异常都是诸如不可靠的连接到输入/输出失败或者未能在给与的时间内执行完HTPP方法(套接字超时)。一般来说,传输异常是非致命的错误,通过多次执行方法能够恢复。在非幕等方法中恢复特别需要注意(详细信息请参考HTTP传输安全)。 

 

java.io.IOException 

HttpCinet一般的传输异常可以用标准JAVA中 java.io.IOException或者其子类java.net.SocketException,java.net.InterruptedIOException来表示。 

为了规划化输入/输出异常类,HttpClient定义多种自定义传输异常用来传递HttpClient特定的信息。 

org.apache.commons.httpclient.NoHttpResponseException
java.io.IOException
+- org.apache.commons.httpclient.NoHttpResponseException 

 

在某些情况下,由于服务器负载过大,服务器能接受到请求,但是没有能力去处理,像工作线程这样限制性资源就是一个很少的例子。这可能会导致服务器丢弃与客户端的连接,而不会给予任何回应。HttpClient遭遇这种情况时,抛出NoHttpResponseException 。在多数情况下,通过重试能够从此异常中恢复。 

org.apache.commons.httpclient.ConnectTimeoutException
java.io.IOException
+- java.io.InterruptedIOException 

这种异常表示在给定的时间HttpClient与目标服务器或代理服务器建立起连接。 

 

org.apache.commons.httpclient.ConnectionPoolTimeoutException 

  1. java.io.IOException  
  2.   +- java.io.InterruptedIOException  
  3.     +- org.apache.commons.httpclient.ConnectTimeoutException  
  4.       +- org.apache.commons.httpclient.ConnectionPoolTimeoutException  

只有在使用多线程连接管理器时,才可能发生此异常。此异常表示在给定的时间从连接池中获取一个空闲连接失败。 

 

org.apache.commons.httpclient.HttpRecoverableException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.HttpRecoverableException  

废弃,任何标准HttpClient类中不会抛出此异常。 

 

协议异常 

在HTTP规范的解释中,协议异常通常是由客户端与服务器(web服务器或是代理服务器)的不匹配导致的逻辑错误。如果不对客户端的请求或服务器做出调整,HttpClient此异常不能恢复。HTTP规范的多个方面允许不同甚至是相互冲突的解释。HttpClient能偶采用配置来支持从非常宽松到非常严格的HTTP规范的遵从度。 

 

org.apache.commons.httpclient.HttpException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  

HttpException在HttpClient中代表一个抽象逻辑错误,一般情况下,程序不能从这种错误中恢复。 

 

org.apache.commons.httpclient.ProtocolException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.ProtocolException  

ProtocolException表示一个HTTP规范的冲突,值得注意的是HTTP代理服务器和HTTP服务器有着不同的HTTP规范的支持度级别。通过配置HttpClient更宽松可以让程序从非致命的协议冲突的HTTP协议异常恢复。 

 

org.apache.commons.httpclient.auth.MalformedChallengeException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.ProtocolException  
  4.       +- org.apache.commons.httpclient.auth.MalformedChallengeException  

内部使用 

MalformedChallengeException表示一个身份认证凭证的某些方面在给定的身份认证的上下文中是无效或者非法的。 

 

org.apache.commons.httpclient.auth.AuthenticationException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.ProtocolException  
  4.       +- org.apache.commons.httpclient.auth.AuthenticationException  

内部使用 

AuthenticationException用来表示身份认证过程中的失败。通常,认证异常不会传递给调用者,只在内部处理使用。 

 

org.apache.commons.httpclient.auth.AuthChallengeException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.ProtocolException  
  4.       +- org.apache.commons.httpclient.auth.AuthenticationException  
  5.         +- org.apache.commons.httpclient.auth.AuthChallengeException  

内部使用 

HttpClient无法响应服务器发送的任何身份验证质询时,AuthenticationException将会抛出。 

 

org.apache.commons.httpclient.auth.CredentialsNotAvailableException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.ProtocolException  
  4.       +- org.apache.commons.httpclient.auth.AuthenticationException  
  5.         +- org.apache.commons.httpclient.auth.CredentialsNotAvailableException

内部使用 

CredentialsNotAvailableException表明响应身份验证质询的要求的证书不可用。 

 

org.apache.commons.httpclient.auth.InvalidCredentialsException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.ProtocolException  
  4.       +- org.apache.commons.httpclient.auth.AuthenticationException  
  5.         +- org.apache.commons.httpclient.auth.InvalidCredentialsException  

内部使用 

InvalidCredentialsException表明响应身份验证质询的要求的证书被服务器拒绝。 

 

org.apache.commons.httpclient.cookie.MalformedCookieException 

java.io.IOException 

  +- org.apache.commons.httpclient.HttpException 

    +- org.apache.commons.httpclient.ProtocolException 

      +- org.apache.commons.httpclient.cookie.MalformedCookieException 

内部使用 

MalformedCookieException表示cookie的某些方面在给定的HTTP会话上下文中是无效或者非法的。有多种不兼容cookie规范,因此,cookie合法性建立在用于分析的特定cookie规范的上下文中和验证服务器发送cookie头消息。如果应用程序需要处理不常见的cookie规范定义的cookie,请查看cookie文档获取更多的信息。 

 

org.apache.commons.httpclient.RedirectException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.ProtocolException  
  4.       +- org.apache.commons.httpclient.RedirectException  

RedirectException表示一个无效的重定向响应导致了HTTP规范冲突。如果使用HttpClient的应用程序就重定向需要更多的宽松度的话,它可以选择禁用自动重定向处理和实现自定义重定向策略。 

 

org.apache.commons.httpclient.URIException 

  1. java.io.IOException  
  2.   +- org.apache.commons.httpclient.HttpException  
  3.     +- org.apache.commons.httpclient.URIException  

URIException表示请求的URL不符合URI规范。 

 

HTTP传输安全 

有必要了解是HTTP协议并不适用于所有类型的应用程序。HTTP是一个简单的面向requestre/sponse的协议,协议最初设计为支持静态或动态生成的内容检索。它从未打算支持事务性操作。例如,如果HTTP服务器成功接收和处理该请求,HTTP服务器会考虑其履行契约的一部分,生成响应和发送状态码回客户端。如果客户端由于读取超时,请求取消,或者系统崩溃而导致读取整个响应失败,服务器将不试图回滚事务。如果客户端重新发送同一请求,服务器将最终无可避免再一次执行同一事务。在某些情况下,将有可能导致应用程序数据的损坏或程序状态的不一致。 

即使HTTP从未被设计为支持事务性处理,它还是可以用作满足某些条件关键应用程序传输协议。为确保HTTP传输层安全系统必须确保应用层上的HTTP方法是幕等的。 

幕等方法 

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尝试从异常中自动恢复。默认的自动恢复机制仅限于少数的几个已知安全的异常。HttpClient不会尝试从任何逻辑或是HTTP协议错误(HttpException派生的异常类)中恢复。 

HttpClient将最多5次自动重试因传输异常失败的方法,虽然请求仍被传输到目标服务器(也就是说,请求尚未完全传送到服务器)。 

HttpClient将最多自动重试那些方法5次,直到请求完全传送到服务器,但该服务器没有响应的HTTP状态代码(服务器只是简单的丢弃连接而没有发回任何响应)。在这种情况下则假定请求未被服务器处理和应用程序状态没有改变。如果web服务器应用程序目标的假设不成立,那么极力建议您提供自定义的异常处理程序。 

 

自定义异常处理类 

为了启用自定义异常的恢复机制应提供HttpMethodRetryHandler接口的实现。 

 

HttpClient client = new HttpClient();HttpMethodRetryHandler myretryhandler = new HttpMethodRetryHandler() {public boolean retryMethod(final HttpMethod method, final IOException exception, int executionCount) {if (executionCount >= 5) {// Do not retry if over max retry countreturn false;
}if (exception instanceof NoHttpResponseException) {// Retry if the server dropped connection on usreturn true;
}if (!method.isRequestSent()) {// Retry if the request has not been sent fully or// if it's OK to retry methods that have been sentreturn true;
}// otherwise do not retryreturn false;
}
};GetMethod httpget = new GetMethod("http://www.whatever.com/");
httpget.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, myretryhandler);
try {
client.executeMethod(httpget);
System.out.println(httpget.getStatusLine().toString());
} finally {
httpget.releaseConnection();
}

转载于:https://www.cnblogs.com/-lpf/p/4535492.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再读《精通css》02:选择器

2019独角兽企业重金招聘Python工程师标准>>> 1.2 为样式找到目标1、类型选择器用来选择特定类型的原素。比如p,a,h1等等。也叫元素选择器或简单选择器。2、后代选择器用来寻找特定元素或元素组的后代。后代选择器由两个选择器之间的空格表示。…

余弦欧式距离matlab,余弦相似度和欧几里得距离

1.余弦相似度同过两个向量的夹角的余弦值来判断两个向量的相似度。余弦值取值[-1,1],越接近1,两向量夹角越小,越相似。图片.png二维公式:图片.pngn维公式:图片.png存在的问题[1]:余弦相似度更多的是从方向上区分差异&a…

App Store 排名获取。

为什么80%的码农都做不了架构师?>>> https://affiliate.itunes.apple.com/resources/documentation/genre-mapping/ app榜示例 , 取中国免费榜前10条: 首先访问 https://itunes.apple.com/WebObjects/MZStoreServices.woa…

使用 Playwright 对 ASP.NET Core 应用执行功能测试

前言在前面的文章中,我们已经介绍过 Playwright for .NET,它常用于自动化测试已经部署好的 Web 应用。其实,开发人员也可以使用它在 ASP.NET Core 应用程序中进行功能测试。功能测试功能测试是从用户角度编写,用于基于其要求验证系…

PHP自动查找指定文件夹下所有文件BOM和删除所有文件

2019独角兽企业重金招聘Python工程师标准>>> <?php if (isset($_GET[dir])){ //设置文件目录 $basedir$_GET[dir]; }else{ $basedir .; } $auto 1; checkdir($basedir); function checkdir($basedir){ if ($dh opendir(…

php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法

Composer项目地址 https://getcomposer.org中文 http://docs.phpcomposer.com/Composer是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库&#xff0c;它会在你的项目中为你安装他们。一、安装Composer官网有详细介绍安装方法&#xff0c;包括windows和linux系统。以…

基于ASP.NET Core api 的服务器事件发送

现如今程序员对Web API的调用已经是轻车熟路。但是传统的api调用都是拉模式&#xff0c;也就是主动发起请求去调用一个api.但是程序员往往对另一种很有用的模式很陌生&#xff0c;即推模式。拉模式 - 主动调用并获取结果的模式。推模式 - 订阅并接受数据推送的模式。今天要介绍…

Android之解决java.lang.NoSuchMethodError:android.os.powerManager.isInteractive问题

1、问题 再三星平板(Android 4.2.2系统)我们代码powerManager调用了函数isInteractive方法,出现下面错误 java.lang.NoSuchMethodError:android.os.powerManager.isInteractive 2、解决办法 1、一开始想用try catch来解决,肯定不行,功能没实现,而且进程还是会挂 2…

DDD为何叫好不叫座?兼论DCI与业务分析的方法论

今天&#xff0c;仔细阅读了园子里面的一个朋友写的《一缕阳光&#xff1a;DDD&#xff08;领域驱动设计&#xff09;应对具体业务场景&#xff0c;如何聚焦 Domain Model&#xff08;领域模型&#xff09;&#xff1f;》(http://www.cnblogs.com/xishuai/p/3800656.html)这篇博…

php 实现的字典序排列算法,字典序的一个生成算法

字典序的一个生成算法。最近在LeetCode刷题&#xff0c;刷到一个题&#xff0c;链接&#xff1a;https://leetcode-cn.com/problems/permutation-sequence/这个题要求得长度为n的字典序列的第k个排列。我们知道&#xff0c;字典序列是一个长度为n(n>1)&#xff0c;元素为1~n…

BeetleX服务网关流量控制

为了保障后台服务应用更可靠地运行&#xff0c;网关提供了一些基础流量控制功能&#xff1b;通过这一功能可以限制流转到后台应用服务的处理量&#xff0c;从而让服务在可应对的并发范围内更可靠地运作。服务网关提供了流量控制有基础控制、IP、域名和请求路径。基础配置主要包…

【cocos2d-x】2.0升级为3.0一些常见变化纪录

1.去CC之前2.0的CC**,把CC都去掉&#xff0c;基本的元素都是保留的2.0CCSprite CCCallFunc CCNode ..3.0Sprite CallFunc Node ..2.cc***结构体改变2.0 ccp(x,y) ccpAdd(p1,p2)ccpSubccpMultccpLength(p)ccpDot(p1,p2);ccc3()ccc4()ccWHITECCPointZeroCCSizeZer…

Java Web开发——Servlet监听器

一、Servlet监听器的概念 Servlet监听器是Servlet规范中定义的一种特殊类&#xff0c;用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件&#xff0c;以及监听这些域对象中属性发生修改的事件。 监听对象&#xff1a; 1、ServletContext&#xff1…

通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...

目录&#xff1a;一、通过Dapr实现一个简单的基于.net的微服务电商系统二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解三、通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr四、通过Dapr实现一个简单的基于.net的微服…

php怎么关闭oracle连接,PHP 连接 Oracle

起因由于项目的数据库需要用客户购买的Oracle数据库&#xff0c;所以需要php安装oci扩展。运行环境php : 7.2系统: windows10oracle: 11gR2安装相关环境由于php的oci8扩展还是需要使用到oracle的一些包&#xff0c;所以先下载这一些。下载完成后解压缩这个压缩包&#xff0c;并…

.NET 深度指南:Colors

作者 &#xff5c; Peter Huber译者 &#xff5c; 王强策划 &#xff5c; 丁晓昀我不知道你们是什么情况&#xff0c;但我自己在过去多年中都因为.NET 色彩&#xff08;Colors&#xff09;类中可用的色彩数量有限而头痛不已&#xff0c;为此我试图用 ColorPickers 获得匹配的色…

php 怎么打出来的,word书名号怎么打出来

书名号怎么打出来&#xff1f;书名号相信大家都不会陌生了&#xff0c;正常情况下&#xff0c;我们会将书名、歌曲名、作品名等用书名号框起来&#xff0c;这样就可以让读者一目了然。然而很多用户在编辑Word和Excel文档时&#xff0c;想输入书名号却不知从何下手&#xff0c;这…

springMVC带文件的表单数据无法绑定到参数中

2019独角兽企业重金招聘Python工程师标准>>> 在一个带enctype"multipart/form-data"属性的表单提交时发现&#xff0c;该表单中包含的其他input无法设置到对应方法参数中。 如下&#xff1a; JSP&#xff1a;带enctype"multipart/form-data"属性…

关于Retinex图像增强算法的一些新学习。

最近再次看了一下IPOL网站&#xff0c;有一篇最近发表的文章&#xff0c;名字就是Multiscale Retinex&#xff0c;感觉自己对这个已经基本了解了&#xff0c;但还是进去看了看&#xff0c;也有一些收获&#xff0c;于是抽空把他们稍微整理了下&#xff0c;原始文章及其配套代码…

如何判断 .NET Core 应用程序是以管理员身份运行

有时候&#xff0c;我们需要知道当前程序是否以管理员身份运行&#xff0c;以便执行一些需要特殊权限的操作。在github(https://github.com/dotnet/runtime/issues/25118#issuecomment-367407469)上找到了一个解决方案&#xff1a;//需要引用nuget包Mono.Posix.NETStandard pub…