首页 > 高级民工 > Apache HttpClient无法解析错误头信息

Apache HttpClient无法解析错误头信息

2013年8月19日 发表评论 阅读评论

  在使用HttpClient 4.2时遇到服务器返回头信息错误的情况会导致一个异常发生。

Caused by: org.apache.http.ProtocolException: Invalid header: content-Type=text/html;charset=gbk
	at org.apache.http.impl.io.AbstractMessageParser.parseHeaders(AbstractMessageParser.java:226)
	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261)
	at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
	at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
	at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
	at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
	at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)

出现异常的原因是org.apache.http.message.BufferedHeader类无法解析,所以如果想要忽略header信息的要嘛修改HttpClient的源码,要嘛通过继承来重写方法实现。HttpClient的官方文档中已有说明 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/advanced.html
  但上面的方法对于使用PoolingClientConnectionManager的情况是不适用的。在使用PoolingClientConnectionManager时由于其实现内部用到了连接池org.apache.http.impl.conn.HttpConnPool,在其中有个static类用于返回DefaultClientConnection,代码如下:

    static class InternalConnFactory implements ConnFactory<HttpRoute, OperatedClientConnection> {
 
        public OperatedClientConnection create(final HttpRoute route) throws IOException {
            return new DefaultClientConnection();
        }
 
    }

所以结合HttpClient文档中的方法则需要在这里对return new DefaultClientConnection();这句代码进行修改就能达到目的。当然为了不修改其源码一个实现方式是自己创建一个包路径为org.apache.http.impl.conn,在这个包下创建继承于PoolingClientConnectionManager的类来最终达到忽略异常header的目的。

分类: 高级民工 标签:
  1. 本文目前尚无任何评论.

点击刷新