在特定条件下,也许需要来定制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);
分享到:
相关推荐
在JAVA中使用HttpClient访问HTTP请求并处理response,涉及到的主要知识点包括: 1. **HttpClient的基本使用**: - 创建HttpClient实例:通常使用`HttpClientBuilder`或`HttpClients`类创建HttpClient对象。 - ...
10. **错误处理**:在处理响应时,需要检查状态码以确定请求是否成功。通常,2xx系列的状态码表示成功,而4xx和5xx系列则表示客户端或服务器端的错误。 通过理解并熟练运用以上知识点,你将能够利用HttpClient库...
总之,ESP8266HTTPClient库极大地简化了ESP8266在处理HTTP请求时的工作,使开发者能更专注于实现具体的应用逻辑,而不用关心底层通信细节。在8266开发中,这个库是一个不可或缺的工具,尤其对于需要与Web服务交互的...
5. **错误处理**:当请求失败或发生异常时,HttpClient应能提供错误信息。这可能通过异常机制或者返回错误代码实现。 6. **连接管理**:为了提高效率,HttpClient可能会使用连接池来复用TCP连接,减少每次请求的...
6. **处理响应**:`HttpResponse`对象包含了服务器的响应信息,如状态码、响应头和响应体。我们可以使用`getStatusLine`获取状态码,`getEntity`获取响应体,如果响应体是文本,可以使用`EntityUtils.toString...
在本实例中,我们将探讨如何使用HttpClient库来模拟登录网站,获取用户信息,以及处理带有验证码的登录场景。 首先,我们需要理解HttpClient的基本使用。HttpClient的核心类包括HttpClient本身,HttpGet、HttpPost...
HttpClient使用它来记录信息和错误。 4. `commons-codec-1.4.jar`:提供了各种编码算法,如Base64和Hex,HttpClient可能用它来编码URL、处理cookies或其他需要编码的数据。 在使用HttpClient时,开发者需要注意一些...
HttpClient的异常通常继承自`HttpException`和`IOException`,在执行请求时需要捕获这些异常进行适当的错误处理。 七、安全性 HttpClient支持SSL/TLS,可以通过配置`SSLContext`和`KeyStore`实现HTTPS请求。还可以...
- 处理响应:`StatusLine statusLine = response.getStatusLine();` 和 `InputStream content = response.getEntity().getContent();` 3. **HttpPost与请求参数**: - 对于POST请求,使用`HttpPost`,并通过`...
7. 处理响应,如检查状态码、提取登录后的cookie信息等: ```java if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 登录成功,可能需要解析响应获取cookie或其他信息 } else { // ...
在HttpClient中,它用于记录请求和响应的详细信息,帮助调试和性能分析。 2. **commons-codec**:提供了各种编码算法,如Base64、URL编码和ASCII85编码,HttpClient用它来处理请求和响应中的编码问题,特别是在处理...
// 处理错误响应 } ``` 6. **读取响应体** 可以使用`EntityUtils`类来读取响应体的内容: ```java HttpEntity entity = response.getEntity(); String responseBody = EntityUtils.toString(entity, ...
HttpClient是Apache基金会开发的一个Java库,用于执行HTTP请求...这个例子只是一个基本的框架,实际应用中可能需要处理更多的情况,如重试、超时、错误处理等。希望这个Demo能帮助你在实际项目中更好地运用HttpClient。
在实际项目中,可能还需要处理重定向、超时、错误处理等复杂情况。注意,对于HTTPS站点,可能需要配置SSLContext和TrustManager,以允许HttpClient信任自签名证书或特定的CA。 此外,`WebRoot`和`src`目录通常是Web...
在实际开发中,根据项目需求,你可以扩展这些通用方法,添加错误处理、日志记录、缓存等功能,使其更加健壮和易用。在"ccb-ita"这个文件中,可能包含了具体的代码实现或者示例,可以帮助你更好地理解和实践这些概念...
- **设置请求头**(可选):如果URL需要身份验证或其他特定头信息,可以通过`setHeader()`方法添加。 - **执行请求**:使用HttpClient的`execute()`方法发送请求,并获取`HttpResponse`对象。 - **处理响应**:...
可以通过`getStatusLine()`获取状态码,`getHeaders`获取头信息,`EntityUtils.toString(response.getEntity())`获取响应体内容。 6. **重试与连接管理** HttpClient提供了连接管理和重试策略。可以通过`...
4. **错误处理**:HttpClient 提供了异常处理机制,如重试、超时等,可以根据需求定制。 三、应用示例 HttpClient 在实际项目中的应用广泛,例如: 1. **Web服务调用**:通过 HttpClient 发送 RESTful API 请求,...
关于`源码`标签,阅读HttpClient的源码有助于深入理解其工作原理,特别是对于性能优化、错误排查或者扩展自定义功能时。Apache HttpClient的源码结构清晰,注释丰富,是学习HTTP通信和网络编程的好材料。 至于`工具...