apache的HttpComponents项目的介绍和简单使用

1、HttpComponents项目的介绍


先介绍一下一个开源项目, 这个项目就是Apache开源组织中的HttpComponents,主要是提供对http服务器的访问功能,目前已经是一个单独的项目,可见http服务器的访问绝非易事。



    在某些时候可能需要通过程序来访问这别人的网页程序,比如从别人的网页中“偷”一些数据。如果对方仅仅是一个很简单的页面,那我们的程序会很简单,。但是考虑到一些服务授权的问 题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到 COOKIE问题的处理。我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面!再比如通过HTTP来上传文件呢?


    HttpComponents项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给 httpclient替你完成。

   网址:http://www.apache.org/   主页下面的Projects 可以找到HttpComponents项目,下载到相应的jar包,以及源代码跟示例程序。


2、httpcomponents 4.5.2 简单使用


HttpComponents 也就是以前的httpclient项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议。不过现在的 HttpComponents 包含多个子项目,有:

HttpComponents Core
HttpComponents Client

HttpComponents AsyncClient

Commons HttpClient

以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。

实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
支持自动转向
支持 HTTPS 协议
支持代理服务器等
支持Cookie

之前用的HttpClient的方法都失效了,比如 httpclinet =new DefaultHttpClient(); 不知道为啥包里80%的类都失效了,总是觉得创建一个httpclient实例会比较麻烦,记不住。所以整理了一下新的方式简单使用。 
简单使用


导入jar包

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <dependency>  
  2.     <groupId>org.apache.httpcomponents</groupId>  
  3.     <artifactId>httpclient</artifactId>  
  4.     <version>4.5.2</version>  
  5. </dependency>  

get请求获取响应

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. CloseableHttpClient httpClient= HttpClients.createDefault();  
  2. HttpGet httpget = new HttpGet("http://www.baidu.com");  
  3. CloseableHttpResponse response = httpClient.execute(httpget);  
  4. HttpEntity httpEntity= response.getEntity();  
  5. String strResult= EntityUtils.toString(httpEntity);  
post请求获取响应

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. HttpPost httpost = new HttpPost("https://www.baidu.com");  
  2. List <NameValuePair> nvps = new ArrayList <NameValuePair>();  
  3. nvps.add(new BasicNameValuePair("IDToken1""username"));  
  4. nvps.add(new BasicNameValuePair("IDToken2""password"));  
  5. httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));  

HttpClient提供URIBuilder工具类来简化URIs的创建和修改过程。

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. URI uri = new URIBuilder()    
  2.         .setScheme("http")    
  3.         .setHost("www.google.com")    
  4.         .setPath("/search")    
  5.         .setParameter("q""httpclient")    
  6.         .setParameter("btnG""Google Search")    
  7.         .setParameter("aq""f")    
  8.         .setParameter("oq""")    
  9.         .build();    
  10. HttpGet httpget = new HttpGet(uri);    
  11. System.out.println(httpget.getURI())  
模拟浏览器请求
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. httpget.setHeader("User-Agent""Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0");  

3、HttpComponents之httpclient基本使用方法 - httpclient的版本是4.3

 A、第一种方式

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. import org.apache.http.HttpEntity;  
  2. import org.apache.http.HttpResponse;  
  3. import org.apache.http.NameValuePair;  
  4. import org.apache.http.client.HttpClient;  
  5. import org.apache.http.client.config.RequestConfig;  
  6. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  7. import org.apache.http.client.methods.HttpPost;  
  8. import org.apache.http.impl.client.DefaultHttpClient;  
  9. import org.apache.http.message.BasicNameValuePair;  
  10. import org.apache.http.util.EntityUtils;  
  11.    
  12. import java.io.IOException;  
  13. import java.util.ArrayList;  
  14. import java.util.List;  
  15.    
  16. public class HttpClient2 {  
  17.    
  18.     public static void main(String args[]) throws IOException {  
  19.         List<NameValuePair> formparams = new ArrayList<NameValuePair>();  
  20.         formparams.add(new BasicNameValuePair("account"""));  
  21.         formparams.add(new BasicNameValuePair("password"""));  
  22.         HttpEntity reqEntity = new UrlEncodedFormEntity(formparams, "utf-8");  
  23.    
  24.         RequestConfig requestConfig = RequestConfig.custom()  
  25.                 .setSocketTimeout(5000)  
  26.                 .setConnectTimeout(5000)  
  27.                 .setConnectionRequestTimeout(5000)  
  28.                 .build();  
  29.    
  30.         HttpClient client = new DefaultHttpClient();  
  31.         HttpPost post = new HttpPost("http://cnivi.com.cn/login");  
  32.         post.setEntity(reqEntity);  
  33.         post.setConfig(requestConfig);  
  34.         HttpResponse response = client.execute(post);  
  35.    
  36.         if (response.getStatusLine().getStatusCode() == 200) {  
  37.             HttpEntity resEntity = response.getEntity();  
  38.             String message = EntityUtils.toString(resEntity, "utf-8");  
  39.             System.out.println(message);  
  40.         } else {  
  41.             System.out.println("请求失败");  
  42.         }  
  43.     }  
  44. }  

B、第二种方式,这种方式是用了一个http的连接池,同时使用httpbuilder构造合适的http方法。
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. import org.apache.http.HttpEntity;  
  2. import org.apache.http.HttpHost;  
  3. import org.apache.http.HttpResponse;  
  4. import org.apache.http.NameValuePair;  
  5. import org.apache.http.client.HttpClient;  
  6. import org.apache.http.client.config.RequestConfig;  
  7. import org.apache.http.client.methods.HttpUriRequest;  
  8. import org.apache.http.client.methods.RequestBuilder;  
  9. import org.apache.http.conn.routing.HttpRoute;  
  10. import org.apache.http.impl.client.CloseableHttpClient;  
  11. import org.apache.http.impl.client.HttpClientBuilder;  
  12. import org.apache.http.impl.client.HttpClients;  
  13. import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;  
  14. import org.apache.http.message.BasicNameValuePair;  
  15. import org.apache.http.util.EntityUtils;  
  16.    
  17. import java.io.IOException;  
  18. import java.util.*;  
  19.    
  20. public class HttpClientUtils {  
  21.    
  22.     private static PoolingHttpClientConnectionManager connectionManager = null;  
  23.     private static HttpClientBuilder httpBulder = null;  
  24.     private static RequestConfig requestConfig = null;  
  25.    
  26.     private static int MAXCONNECTION = 10;  
  27.    
  28.     private static int DEFAULTMAXCONNECTION = 5;  
  29.    
  30.     private static String IP = "cnivi.com.cn";  
  31.     private static int PORT = 80;  
  32.    
  33.     static {  
  34.         //设置http的状态参数  
  35.         requestConfig = RequestConfig.custom()  
  36.                 .setSocketTimeout(5000)  
  37.                 .setConnectTimeout(5000)  
  38.                 .setConnectionRequestTimeout(5000)  
  39.                 .build();  
  40.    
  41.         HttpHost target = new HttpHost(IP, PORT);  
  42.         connectionManager = new PoolingHttpClientConnectionManager();  
  43.         connectionManager.setMaxTotal(MAXCONNECTION);  
  44.         connectionManager.setDefaultMaxPerRoute(DEFAULTMAXCONNECTION);  
  45.         connectionManager.setMaxPerRoute(new HttpRoute(target), 20);  
  46.         httpBulder = HttpClients.custom();  
  47.         httpBulder.setConnectionManager(connectionManager);  
  48.     }  
  49.    
  50.     public static CloseableHttpClient getConnection() {  
  51.         CloseableHttpClient httpClient = httpBulder.build();  
  52.         httpClient = httpBulder.build();  
  53.         return httpClient;  
  54.     }  
  55.    
  56.     public static HttpUriRequest getRequestMethod(Map<String, String> map, String url, String method) {  
  57.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  58.         Set<Map.Entry<String, String>> entrySet = map.entrySet();  
  59.         for (Map.Entry<String, String> e : entrySet) {  
  60.             String name = e.getKey();  
  61.             String value = e.getValue();  
  62.             NameValuePair pair = new BasicNameValuePair(name, value);  
  63.             params.add(pair);  
  64.         }  
  65.         HttpUriRequest reqMethod = null;  
  66.         if ("post".equals(method)) {  
  67.             reqMethod = RequestBuilder.post().setUri(url)  
  68.                     .addParameters(params.toArray(new BasicNameValuePair[params.size()]))  
  69.                     .setConfig(requestConfig).build();  
  70.         } else if ("get".equals(method)) {  
  71.             reqMethod = RequestBuilder.get().setUri(url)  
  72.                     .addParameters(params.toArray(new BasicNameValuePair[params.size()]))  
  73.                     .setConfig(requestConfig).build();  
  74.         }  
  75.         return reqMethod;  
  76.     }  
  77.    
  78.     public static void main(String args[]) throws IOException {  
  79.         Map<String, String> map = new HashMap<String, String>();  
  80.         map.put("account""");  
  81.         map.put("password""");  
  82.    
  83.         HttpClient client = getConnection();  
  84.         HttpUriRequest post = getRequestMethod(map, "http://cnivi.com.cn/login""post");  
  85.         HttpResponse response = client.execute(post);  
  86.    
  87.         if (response.getStatusLine().getStatusCode() == 200) {  
  88.             HttpEntity entity = response.getEntity();  
  89.             String message = EntityUtils.toString(entity, "utf-8");  
  90.             System.out.println(message);  
  91.         } else {  
  92.             System.out.println("请求失败");  
  93.         }  
  94.     }  
  95. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值