jar包:
HttpClient 4.x版本
简要介绍
HttpComponents 包括 HttpCore包和HttpClient包
HttpClient:Http的执行http请求
DefaultHttpClient:httpClient默认实现
HttpGet、HttpPost:Get、Post方法执行类
HttpResponse:执行返回的Response,含http的header和执行结果实体Entity
HttpEntity:Http返回结果实体,不含Header内容
HttpParam:连接参数,配合连接池使用
PoolingClientConnectionManager:连接池
基础Get方法
- // 默认的client类。
- HttpClient client = new DefaultHttpClient();
- // 设置为get取连接的方式.
- HttpGet get = new HttpGet(url);
- // 得到返回的response.
- HttpResponse response = client.execute(get);
- // 得到返回的client里面的实体对象信息.
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- System.out.println( entity.getContentEncoding());
- System.out.println( entity.getContentType());
- // 得到返回的主体内容.
- InputStream instream = entity.getContent();
- BufferedReader reader = new BufferedReader(new InputStreamReader(instream, encoding));
- System.out.println(reader.readLine());
- // EntityUtils 处理HttpEntity的工具类
- // System.out.println(EntityUtils.toString(entity));
- }
- // 关闭连接.
- client.getConnectionManager().shutdown();
基础Post方法
- DefaultHttpClient httpclient = new DefaultHttpClient();
- HttpPost httpost = new HttpPost(url);
- // 添加参数
- List<NameValuePair> formparams = new ArrayList<NameValuePair>();
- formparams.add(new BasicNameValuePair("p", "1"));
- formparams.add(new BasicNameValuePair("t", "2"));
- formparams.add(new BasicNameValuePair("e", "3"));
- UrlEncodedFormEntity urlEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
- httpost.setEntity(urlEntity);
- HttpResponse response = httpclient.execute(httpost);
- HttpEntity entity = response.getEntity();
- System.out.println("Login form get: " + response.getStatusLine() + entity.getContent());
- // dump(entity, encoding);
- System.out.println("Post logon cookies:");
- List<Cookie> cookies = httpclient.getCookieStore().getCookies();
- for (int i = 0; i < cookies.size(); i++) {
- System.out.println("- " + cookies.get(i).toString());
- }
- // 关闭请求
- httpclient.getConnectionManager().shutdown();
保留Session,保留用户+密码状态
Demo1,只支持单线程
- DefaultHttpClient httpclient = new DefaultHttpClient(
- new ThreadSafeClientConnManager());
- HttpPost httpost = new HttpPost(url);
- // 添加参数
- List<NameValuePair> formparams = new ArrayList<NameValuePair>();
- formparams.add(new BasicNameValuePair("p", "1"));
- formparams.add(new BasicNameValuePair("t", "2"));
- formparams.add(new BasicNameValuePair("e", "3"));
- // 设置请求的编码格式
- httpost.setEntity(new UrlEncodedFormEntity(formparams, Consts.UTF_8));
- // 登录一遍
- httpclient.execute(httpost);
- // 然后再第二次请求普通的url即可。
- httpost = new HttpPost(url2);
- BasicResponseHandler responseHandler = new BasicResponseHandler();
- System.out.println(httpclient.execute(httpost, responseHandler));
- httpclient.getConnectionManager().shutdown();
- return "";
Demo2:第二次请求带上第一次请求的Cookie
用于在用户+密码等候后,后续根据第一次请求的URL获取的Cookie,把这些Cookie添加到第二次请求的Cookie中
- DefaultHttpClient httpclient = new DefaultHttpClient();
- HttpPost httpost = new HttpPost(url);
- // 添加参数
- List<NameValuePair> formparams = new ArrayList<NameValuePair>();
- formparams.add(new BasicNameValuePair("uname", name));
- formparams.add(new BasicNameValuePair("pass", "e0c10f451217b93f76c2654b2b729b85"));
- formparams.add(new BasicNameValuePair("auto_login","0"));
- formparams.add(new BasicNameValuePair("a","1"));
- formparams.add(new BasicNameValuePair("backurl","1"));
- UrlEncodedFormEntity urlEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
- httpost.setEntity(urlEntity);
- HttpContext localContext = new BasicHttpContext();
- HttpResponse response = httpclient.execute(httpost,localContext);
- HttpEntity entity = response.getEntity();
- // 打印获取值
- System.out.println(Arrays.toString(response.getAllHeaders()));
- System.out.println(EntityUtils.toString(entity));
- // 第二次请求,使用上一次请求的Cookie
- DefaultHttpClient httpclient2 = new DefaultHttpClient();
- HttpPost httpost2 = new HttpPost("http://my.ifeng.com/?_c=index&_a=my");
- // 获取上一次请求的Cookie
- CookieStore cookieStore2 = httpclient2.getCookieStore();
- // 下一次的Cookie的值,将使用上一次请求
- CookieStore cookieStore = httpclient.getCookieStore();
- List<Cookie> list = cookieStore.getCookies();
- for(Cookie o : list){
- System.out.println(o.getName() + " = " + o.getValue() + " 12");;
- cookieStore2.addCookie(o);
- }
- HttpResponse response2 = httpclient2.execute(httpost2);
- HttpEntity entity2 = response2.getEntity();
- System.out.println(Arrays.toString(response2.getAllHeaders()));
- System.out.println(EntityUtils.toString(entity2));
获取访问上下文:
- HttpClient httpclient = new DefaultHttpClient();
- // 设置为get取连接的方式.
- HttpGet get = new HttpGet(url);
- HttpContext localContext = new BasicHttpContext();
- // 得到返回的response.第二个参数,是上下文,很好的一个参数!
- httpclient.execute(get, localContext);
- // 从上下文中得到HttpConnection对象
- HttpConnection con = (HttpConnection) localContext
- .getAttribute(ExecutionContext.HTTP_CONNECTION);
- System.out.println("socket超时时间:" + con.getSocketTimeout());
- // 从上下文中得到HttpHost对象
- HttpHost target = (HttpHost) localContext
- .getAttribute(ExecutionContext.HTTP_TARGET_HOST);
- System.out.println("最终请求的目标:" + target.getHostName() + ":"
- + target.getPort());
- // 从上下文中得到代理相关信息.
- HttpHost proxy = (HttpHost) localContext
- .getAttribute(ExecutionContext.HTTP_PROXY_HOST);
- if (proxy != null)
- System.out.println("代理主机的目标:" + proxy.getHostName() + ":"
- + proxy.getPort());
- System.out.println("是否发送完毕:"
- + localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));
- // 从上下文中得到HttpRequest对象
- HttpRequest request = (HttpRequest) localContext
- .getAttribute(ExecutionContext.HTTP_REQUEST);
- System.out.println("请求的版本:" + request.getProtocolVersion());
- Header[] headers = request.getAllHeaders();
- System.out.println("请求的头信息: ");
- for (Header h : headers) {
- System.out.println(h.getName() + "--" + h.getValue());
- }
- System.out.println("请求的链接:" + request.getRequestLine().getUri());
- // 从上下文中得到HttpResponse对象
- HttpResponse response = (HttpResponse) localContext
- .getAttribute(ExecutionContext.HTTP_RESPONSE);
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- System.out.println("返回结果内容编码是:" + entity.getContentEncoding());
- System.out.println("返回结果内容类型是:" + entity.getContentType());
- }
连接池和代理:
每次使用最后一句new DefaultHttpClient(cm, httpParams);获取新的HttpClient
里面还有一条如何设置代理
- // HttpParams
- HttpParams httpParams = new BasicHttpParams();
- // HttpConnectionParams 设置连接参数
- // 设置连接超时时间
- HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
- // 设置读取超时时间
- HttpConnectionParams.setSoTimeout(httpParams, 60000);
- SchemeRegistry schemeRegistry = new SchemeRegistry();
- schemeRegistry.register(
- new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
- // schemeRegistry.register(
- // new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
- PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);
- // 设置最大连接数
- cm.setMaxTotal(200);
- // 设置每个路由默认最大连接数
- cm.setDefaultMaxPerRoute(20);
- // // 设置代理和代理最大路由
- // HttpHost localhost = new HttpHost("locahost", 80);
- // cm.setMaxPerRoute(new HttpRoute(localhost), 50);
- // 设置代理,
- HttpHost proxy = new HttpHost("10.36.24.3", 60001);
- httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
- HttpClient httpClient = new DefaultHttpClient(cm, httpParams);
自动重连
如果某次请求请求失败,可以自动重连
- DefaultHttpClient httpClient = new DefaultHttpClient();
- // 可以自动重连
- HttpRequestRetryHandler requestRetryHandler2 = new HttpRequestRetryHandler() {
- // 自定义的恢复策略
- public synchronized boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
- // 设置恢复策略,在发生异常时候将自动重试3次
- if (executionCount > 3) {
- // 超过最大次数则不需要重试
- return false;
- }
- if (exception instanceof NoHttpResponseException) {
- // 服务停掉则重新尝试连接
- return true;
- }
- if (exception instanceof SSLHandshakeException) {
- // SSL异常不需要重试
- return false;
- }
- HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);
- boolean idempotent = (request instanceof HttpEntityEnclosingRequest);
- if (!idempotent) {
- // 请求内容相同则重试
- return true;
- }
- return false;
- }
- };
- httpClient.setHttpRequestRetryHandler(requestRetryHandler2);
使用自定义ResponseHandler处理返回的请求
- HttpClient httpClient = new DefaultHttpClient();
- HttpGet get = new HttpGet(url);
- // 定义一个类处理URL返回的结果
- ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
- public byte[] handleResponse(HttpResponse response)
- throws ClientProtocolException, IOException {
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- return EntityUtils.toByteArray(entity);
- } else {
- return null;
- }
- }
- };
- // 不同于 httpClient.execute(request),返回值是HttpResponse;返回值右ResponseHandler决定
- byte[] charts = httpClient.execute(get, handler);
- FileOutputStream out = new FileOutputStream(fileName);
- out.write(charts);
- out.close();
- httpClient.getConnectionManager().shutdown();
参考文献
相关推荐
总结,`commons-httpclient-3.0.jar`在JAVA中的应用,不仅提供了一种简单易用的HTTP客户端实现,还具有丰富的特性和扩展性,对于理解和实现网络通信具有重要的学习价值。然而,随着技术的进步,开发者应关注并适时...
HttpClient 3.1是其的一个稳定版本,虽然现在已经有了更新的版本(如4.x系列),但在某些场景下,3.1版本仍然有着良好的兼容性和性能。 二、HttpClient的核心组件 1. `HttpConnectionManager`:管理HTTP连接的组件...
源码学习有助于解决实际问题,例如调试、优化性能,或者扩展HttpClient以满足特定需求。 总结来说,HttpClient是一个强大且灵活的HTTP客户端工具,4.5版本增加了对HTTP/2的支持和性能优化。通过`httpclient-4.5.jar...
文档可以帮助开发者了解如何使用HttpClient的各种功能,源代码则提供了深入学习和定制的可能。 1. Jar包:包含了HttpClient的运行库,可以直接引入到项目中使用。 2. 文档:详细介绍了HttpClient的API、配置和使用...
2. **异常处理**:`Httpclient`提供了一系列异常类,用于处理网络错误、服务器错误等情况。 3. **连接管理**:可以使用`PoolingHttpClientConnectionManager`来管理HTTP连接池,提高性能。 #### 六、总结 通过本...
通过本教程的学习,我们了解了Apache HttpClient的基本概念及其在Java开发中的应用价值。它不仅为开发者提供了丰富的API来处理HTTP通信,而且具有良好的性能表现和广泛的适用性。无论是构建Web应用还是实现复杂的...
本文将通过一系列步骤和示例来帮助你入门HttpClient4.1。 ### 1. 环境准备 在开始使用HttpClient之前,你需要确保已经安装了Java环境,并在项目中引入HttpClient的依赖库。通常,你可以通过Maven或Gradle等构建工具...
《HttpClient 4.3.6:HTTP 客户端库详解》 HttpClient 是 Apache 开源组织提供的一款强大的 HTTP 客户端通信库,...通过深入学习和实践,开发者可以充分利用 HttpClient 提供的能力,构建出高效、可靠的网络应用程序。
【C# 操作HTTP协议学习总结】 在C#编程中,操作HTTP协议通常是网络通信的基础,用于发送和接收数据。System.Net.Http命名空间提供了一系列类和方法,使得开发者能够方便地进行HTTP请求和响应的处理。本文将重点讨论...
完成上述步骤后,工程会包含一系列必要的库文件,如activation、commons-beanutils、commons-codec、commons-httpclient、commons-logging、jaxen、jaxws-api、jdom、jsr173_api、mail和saaj-api等。 通过这个简单...
6. 文件系统操作:C#提供了一系列的类库用于与文件系统交互,如File、Directory等。在这一章中,你可能学习如何读写文件、创建和删除目录,以及如何进行文件流操作。 7. 网络编程:C#也支持网络编程,可以用来创建...
总结来说,这个Java模拟淘宝登录源码主要展示了如何使用HttpClient进行网络请求,处理登录过程中的数据交互,并依赖其他Apache Commons库提高代码效率和功能。通过学习和理解这段代码,开发者可以更好地掌握HTTP通信...
- **HttpClient**类提供了异步请求处理的能力,可以通过调用`.sendAsync()`方法发送异步请求。 - **HttpRequest**和**HttpResponse**接口定义了请求和响应的基本结构,使得编写网络客户端变得更加简单和直观。 ####...
这份笔记可能是作者在深入学习Java SE的过程中,对关键概念、语法和特性进行总结的结果。 Java的学习通常从基础语法开始,包括变量、数据类型、运算符、流程控制(如if语句、switch、for、while循环)等。接着会...
### 安卓实践:计算器、简单商城 ...综上所述,本课程通过一系列实践项目,全面介绍了安卓开发的基础知识和技术要点,旨在帮助学生快速掌握安卓开发的核心技能,并能够在实际工作中灵活运用这些技能。
为了更好地满足中文处理的需求,社区开发了一系列的插件,其中“elasticsearch-analysis-ik”是针对Elasticsearch进行中文分词处理的重要插件。本文将详细解析“elasticsearch-analysis-ik-7.2.0”这个版本的插件,...
- **字节流与字符流**:InputStream、OutputStream、Reader、Writer的基本用法,以及Buffered系列流的缓冲功能。 - **对象序列化**:理解序列化机制,如何实现Serializable接口,以及反序列化的操作。 6. **多...
本资源包"**s2深入.NET平台和C#编程课后、上机、指导练习答案项目案例和PPT**"提供了一系列丰富的学习材料,旨在帮助学习者巩固理论知识,提升实战技能。 首先,"课后和上机答案"部分是学习过程中必不可少的参考...