`
Goro
  • 浏览: 172374 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使HttpClient能处理错误ResponseHeader的响应信息。

    博客分类:
  • Java
阅读更多
在特定条件下,也许需要来定制HTTP报文通过线路传递,越过了可能使用的HTTP参数来处理非标准不兼容行为的方式。比如,对于Web爬虫,它可能需要强制HttpClient接受格式错误的响应头部信息,来抢救报文的内容。

自己参考网上写了个类。
package sh.pl;

import java.io.IOException;

import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseFactory;
import org.apache.http.HttpVersion;
import org.apache.http.conn.ClientConnectionOperator;
import org.apache.http.conn.OperatedClientConnection;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.impl.conn.BasicClientConnectionManager;
import org.apache.http.impl.conn.DefaultClientConnection;
import org.apache.http.impl.conn.DefaultClientConnectionOperator;
import org.apache.http.impl.conn.DefaultHttpResponseParser;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.io.SessionInputBuffer;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicLineParser;
import org.apache.http.message.BasicStatusLine;
import org.apache.http.message.LineParser;
import org.apache.http.params.HttpParams;
import org.apache.http.util.CharArrayBuffer;

public class MyBasicClientConnectionManager extends
		BasicClientConnectionManager {

	public MyBasicClientConnectionManager() {
		super();
	}

	@Override
	protected ClientConnectionOperator createConnectionOperator(
			final SchemeRegistry sr) {
		return new MyClientConnectionOperator(sr);
	}

	class MyLineParser extends BasicLineParser {
		@Override
		public Header parseHeader(final CharArrayBuffer buffer) {
			try {
				return super.parseHeader(buffer);
			} catch (Exception ex) {
				// 压制ParseException异常
				return new BasicHeader("invalid", buffer.toString());
			}
		}
	}

	class MyClientConnection extends DefaultClientConnection {
		@Override
		protected HttpMessageParser createResponseParser(
				final SessionInputBuffer buffer,
				final HttpResponseFactory responseFactory,
				final HttpParams params) {
			return new MyDefaultHttpResponseParser(buffer, new MyLineParser(),
					responseFactory, params);
		}
	}

	class MyDefaultHttpResponseParser extends DefaultHttpResponseParser {
		public MyDefaultHttpResponseParser(SessionInputBuffer buffer,
				LineParser parser, HttpResponseFactory responseFactory,
				HttpParams params) {
			super(buffer, parser, responseFactory, params);
		}

		@Override
		protected HttpResponse parseHead(final SessionInputBuffer sessionBuffer)
				throws IOException, HttpException {
			try {
				return super.parseHead(sessionBuffer);
			} catch (Exception ex) {
				// 压制ParseException异常
				return new BasicHttpResponse(new BasicStatusLine(
						HttpVersion.HTTP_1_1, 200, ""));
			}
		}
	}

	class MyClientConnectionOperator extends DefaultClientConnectionOperator {
		public MyClientConnectionOperator(final SchemeRegistry sr) {
			super(sr);
		}

		@Override
		public OperatedClientConnection createConnection() {
			return new MyClientConnection();
		}
	}
}



使用
ClientConnectionManager cm = new MyBasicClientConnectionManager();
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(http);


分享到:
评论

相关推荐

    httpClient,JAVA访问http request response

    在JAVA中使用HttpClient访问HTTP请求并处理response,涉及到的主要知识点包括: 1. **HttpClient的基本使用**: - 创建HttpClient实例:通常使用`HttpClientBuilder`或`HttpClients`类创建HttpClient对象。 - ...

    ESP8266HTTPClient.zip

    总之,ESP8266HTTPClient库极大地简化了ESP8266在处理HTTP请求时的工作,使开发者能更专注于实现具体的应用逻辑,而不用关心底层通信细节。在8266开发中,这个库是一个不可或缺的工具,尤其对于需要与Web服务交互的...

    HttpClient.zip_HTTP_c++ httpclass_c++ httpclient类_http client c+

    5. **错误处理**:当请求失败或发生异常时,HttpClient应能提供错误信息。这可能通过异常机制或者返回错误代码实现。 6. **连接管理**:为了提高效率,HttpClient可能会使用连接池来复用TCP连接,减少每次请求的...

    HttpClient模拟http浏览器请求

    6. **处理响应**:`HttpResponse`对象包含了服务器的响应信息,如状态码、响应头和响应体。我们可以使用`getStatusLine`获取状态码,`getEntity`获取响应体,如果响应体是文本,可以使用`EntityUtils.toString...

    HttpClient模拟登录实例

    在本实例中,我们将探讨如何使用HttpClient库来模拟登录网站,获取用户信息,以及处理带有验证码的登录场景。 首先,我们需要理解HttpClient的基本使用。HttpClient的核心类包括HttpClient本身,HttpGet、HttpPost...

    httpClient入门

    HttpClient使用它来记录信息和错误。 4. `commons-codec-1.4.jar`:提供了各种编码算法,如Base64和Hex,HttpClient可能用它来编码URL、处理cookies或其他需要编码的数据。 在使用HttpClient时,开发者需要注意一些...

    Java-HttpClient帮助文档

    HttpClient的异常通常继承自`HttpException`和`IOException`,在执行请求时需要捕获这些异常进行适当的错误处理。 七、安全性 HttpClient支持SSL/TLS,可以通过配置`SSLContext`和`KeyStore`实现HTTPS请求。还可以...

    HttpClient

    - 处理响应:`StatusLine statusLine = response.getStatusLine();` 和 `InputStream content = response.getEntity().getContent();` 3. **HttpPost与请求参数**: - 对于POST请求,使用`HttpPost`,并通过`...

    HttpClient登录

    7. 处理响应,如检查状态码、提取登录后的cookie信息等: ```java if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 登录成功,可能需要解析响应获取cookie或其他信息 } else { // ...

    HttpClient jar包下载

    10. **错误处理**:在处理响应时,需要检查状态码以确定请求是否成功。通常,2xx系列的状态码表示成功,而4xx和5xx系列则表示客户端或服务器端的错误。 通过理解并熟练运用以上知识点,你将能够利用HttpClient库...

    httpclient测试请求方法

    在HttpClient中,它用于记录请求和响应的详细信息,帮助调试和性能分析。 2. **commons-codec**:提供了各种编码算法,如Base64、URL编码和ASCII85编码,HttpClient用它来处理请求和响应中的编码问题,特别是在处理...

    HTTPClient.rar

    // 处理错误响应 } ``` 6. **读取响应体** 可以使用`EntityUtils`类来读取响应体的内容: ```java HttpEntity entity = response.getEntity(); String responseBody = EntityUtils.toString(entity, ...

    Java 使用HttpClient保持SESSION状态

    在实际项目中,可能还需要处理重定向、超时、错误处理等复杂情况。注意,对于HTTPS站点,可能需要配置SSLContext和TrustManager,以允许HttpClient信任自签名证书或特定的CA。 此外,`WebRoot`和`src`目录通常是Web...

    httpClient完整请求Demo

    HttpClient是Apache基金会开发的一个Java库,用于执行HTTP请求...这个例子只是一个基本的框架,实际应用中可能需要处理更多的情况,如重试、超时、错误处理等。希望这个Demo能帮助你在实际项目中更好地运用HttpClient。

    使用HttpClient调试android接口-通用方法

    在实际开发中,根据项目需求,你可以扩展这些通用方法,添加错误处理、日志记录、缓存等功能,使其更加健壮和易用。在"ccb-ita"这个文件中,可能包含了具体的代码实现或者示例,可以帮助你更好地理解和实践这些概念...

    HTTPClient用法

    可以通过`getStatusLine()`获取状态码,`getHeaders`获取头信息,`EntityUtils.toString(response.getEntity())`获取响应体内容。 6. **重试与连接管理** HttpClient提供了连接管理和重试策略。可以通过`...

    httpclient-4.5.5

    4. **错误处理**:HttpClient 提供了异常处理机制,如重试、超时等,可以根据需求定制。 三、应用示例 HttpClient 在实际项目中的应用广泛,例如: 1. **Web服务调用**:通过 HttpClient 发送 RESTful API 请求,...

    java使用HttpClient通过url下载文件到本地

    - **设置请求头**(可选):如果URL需要身份验证或其他特定头信息,可以通过`setHeader()`方法添加。 - **执行请求**:使用HttpClient的`execute()`方法发送请求,并获取`HttpResponse`对象。 - **处理响应**:...

    Java网络通信之HttpClient

    关于`源码`标签,阅读HttpClient的源码有助于深入理解其工作原理,特别是对于性能优化、错误排查或者扩展自定义功能时。Apache HttpClient的源码结构清晰,注释丰富,是学习HTTP通信和网络编程的好材料。 至于`工具...

Global site tag (gtag.js) - Google Analytics