zoukankan      html  css  js  c++  java
  • HttpClient学习系列 -- 学习总结

    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方法

    Java代码  收藏代码
    1. // 默认的client类。  
    2. HttpClient client = new DefaultHttpClient();  
    3. // 设置为get取连接的方式.  
    4. HttpGet get = new HttpGet(url);  
    5. // 得到返回的response.  
    6. HttpResponse response = client.execute(get);  
    7. // 得到返回的client里面的实体对象信息.  
    8. HttpEntity entity = response.getEntity();  
    9. if (entity != null) {  
    10.     System.out.println( entity.getContentEncoding());  
    11.     System.out.println( entity.getContentType());  
    12.     // 得到返回的主体内容.  
    13.     InputStream instream = entity.getContent();  
    14.     BufferedReader reader = new BufferedReader(new InputStreamReader(instream, encoding));  
    15.     System.out.println(reader.readLine());  
    16.     // EntityUtils 处理HttpEntity的工具类  
    17.     // System.out.println(EntityUtils.toString(entity));  
    18. }  
    19.   
    20. // 关闭连接.  
    21. client.getConnectionManager().shutdown();  

    基础Post方法

    Java代码  收藏代码
    1.     DefaultHttpClient httpclient = new DefaultHttpClient();  
    2.     HttpPost httpost = new HttpPost(url);  
    3.     // 添加参数  
    4.     List<NameValuePair> formparams = new ArrayList<NameValuePair>();  
    5.     formparams.add(new BasicNameValuePair("p", "1"));  
    6.     formparams.add(new BasicNameValuePair("t", "2"));  
    7.     formparams.add(new BasicNameValuePair("e", "3"));  
    8.   
    9.     UrlEncodedFormEntity urlEntity =  new UrlEncodedFormEntity(formparams, "UTF-8");  
    10.     httpost.setEntity(urlEntity);  
    11.   
    12.     HttpResponse response = httpclient.execute(httpost);  
    13.     HttpEntity entity = response.getEntity();  
    14.   
    15.     System.out.println("Login form get: " + response.getStatusLine() + entity.getContent());  
    16. //  dump(entity, encoding);  
    17.     System.out.println("Post logon cookies:");  
    18.     List<Cookie> cookies = httpclient.getCookieStore().getCookies();  
    19.     for (int i = 0; i < cookies.size(); i++) {  
    20.         System.out.println("- " + cookies.get(i).toString());  
    21.     }  
    22.     // 关闭请求  
    23.     httpclient.getConnectionManager().shutdown();  

    保留Session,保留用户+密码状态

    Demo1,只支持单线程

    Java代码  收藏代码
    1. DefaultHttpClient httpclient = new DefaultHttpClient(  
    2.     new ThreadSafeClientConnManager());  
    3.   
    4. HttpPost httpost = new HttpPost(url);  
    5. // 添加参数  
    6. List<NameValuePair> formparams = new ArrayList<NameValuePair>();  
    7. formparams.add(new BasicNameValuePair("p", "1"));  
    8. formparams.add(new BasicNameValuePair("t", "2"));  
    9. formparams.add(new BasicNameValuePair("e", "3"));  
    10. // 设置请求的编码格式  
    11. httpost.setEntity(new UrlEncodedFormEntity(formparams, Consts.UTF_8));  
    12. // 登录一遍  
    13. httpclient.execute(httpost);  
    14. // 然后再第二次请求普通的url即可。  
    15. httpost = new HttpPost(url2);  
    16. BasicResponseHandler responseHandler = new BasicResponseHandler();  
    17. System.out.println(httpclient.execute(httpost, responseHandler));  
    18. httpclient.getConnectionManager().shutdown();  
    19.   
    20. return "";  

    Demo2:第二次请求带上第一次请求的Cookie 

        用于在用户+密码等候后,后续根据第一次请求的URL获取的Cookie,把这些Cookie添加到第二次请求的Cookie中

    Java代码  收藏代码
    1. DefaultHttpClient httpclient = new DefaultHttpClient();  
    2.         HttpPost httpost = new HttpPost(url);  
    3.         // 添加参数  
    4.         List<NameValuePair> formparams = new ArrayList<NameValuePair>();  
    5.         formparams.add(new BasicNameValuePair("uname", name));  
    6.         formparams.add(new BasicNameValuePair("pass", "e0c10f451217b93f76c2654b2b729b85"));  
    7.         formparams.add(new BasicNameValuePair("auto_login","0"));  
    8.         formparams.add(new BasicNameValuePair("a","1"));  
    9.         formparams.add(new BasicNameValuePair("backurl","1"));  
    10.    
    11.         UrlEncodedFormEntity urlEntity =  new UrlEncodedFormEntity(formparams, "UTF-8");  
    12.         httpost.setEntity(urlEntity);  
    13.         HttpContext localContext = new BasicHttpContext();  
    14.   
    15.         HttpResponse response = httpclient.execute(httpost,localContext);  
    16.         HttpEntity entity = response.getEntity();  
    17.         // 打印获取值  
    18.         System.out.println(Arrays.toString(response.getAllHeaders()));  
    19.         System.out.println(EntityUtils.toString(entity));  
    20.    
    21.         // 第二次请求,使用上一次请求的Cookie  
    22.         DefaultHttpClient httpclient2 = new DefaultHttpClient();  
    23.         HttpPost httpost2 = new HttpPost("http://my.ifeng.com/?_c=index&_a=my");  
    24.         // 获取上一次请求的Cookie  
    25.         CookieStore cookieStore2 = httpclient2.getCookieStore();  
    26.         // 下一次的Cookie的值,将使用上一次请求  
    27.         CookieStore cookieStore = httpclient.getCookieStore();  
    28.         List<Cookie> list = cookieStore.getCookies();  
    29.         for(Cookie o : list){  
    30.             System.out.println(o.getName() + " = " + o.getValue() + " 12");;  
    31.             cookieStore2.addCookie(o);  
    32.         }  
    33.    
    34.         HttpResponse response2 = httpclient2.execute(httpost2);  
    35.         HttpEntity entity2 = response2.getEntity();  
    36.         System.out.println(Arrays.toString(response2.getAllHeaders()));  
    37.         System.out.println(EntityUtils.toString(entity2));  

    获取访问上下文

    Java代码  收藏代码
    1. HttpClient httpclient = new DefaultHttpClient();  
    2. // 设置为get取连接的方式.  
    3. HttpGet get = new HttpGet(url);  
    4. HttpContext localContext = new BasicHttpContext();  
    5. // 得到返回的response.第二个参数,是上下文,很好的一个参数!  
    6. httpclient.execute(get, localContext);  
    7.   
    8. // 从上下文中得到HttpConnection对象  
    9. HttpConnection con = (HttpConnection) localContext  
    10.         .getAttribute(ExecutionContext.HTTP_CONNECTION);  
    11. System.out.println("socket超时时间:" + con.getSocketTimeout());  
    12.   
    13. // 从上下文中得到HttpHost对象  
    14. HttpHost target = (HttpHost) localContext  
    15.         .getAttribute(ExecutionContext.HTTP_TARGET_HOST);  
    16. System.out.println("最终请求的目标:" + target.getHostName() + ":"  
    17.         + target.getPort());  
    18.   
    19. // 从上下文中得到代理相关信息.  
    20. HttpHost proxy = (HttpHost) localContext  
    21.         .getAttribute(ExecutionContext.HTTP_PROXY_HOST);  
    22. if (proxy != null)  
    23.     System.out.println("代理主机的目标:" + proxy.getHostName() + ":"  
    24.             + proxy.getPort());  
    25.   
    26. System.out.println("是否发送完毕:"  
    27.         + localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));  
    28.   
    29. // 从上下文中得到HttpRequest对象  
    30. HttpRequest request = (HttpRequest) localContext  
    31.         .getAttribute(ExecutionContext.HTTP_REQUEST);  
    32. System.out.println("请求的版本:" + request.getProtocolVersion());  
    33. Header[] headers = request.getAllHeaders();  
    34. System.out.println("请求的头信息: ");  
    35. for (Header h : headers) {  
    36.     System.out.println(h.getName() + "--" + h.getValue());  
    37. }  
    38. System.out.println("请求的链接:" + request.getRequestLine().getUri());  
    39.   
    40. // 从上下文中得到HttpResponse对象  
    41. HttpResponse response = (HttpResponse) localContext  
    42.         .getAttribute(ExecutionContext.HTTP_RESPONSE);  
    43. HttpEntity entity = response.getEntity();  
    44. if (entity != null) {  
    45.     System.out.println("返回结果内容编码是:" + entity.getContentEncoding());  
    46.     System.out.println("返回结果内容类型是:" + entity.getContentType());  
    47. }  

    连接池和代理:

       每次使用最后一句new DefaultHttpClient(cm, httpParams);获取新的HttpClient

       里面还有一条如何设置代理

    Java代码  收藏代码
    1.         // HttpParams   
    2.         HttpParams httpParams  = new BasicHttpParams();    
    3.         // HttpConnectionParams 设置连接参数  
    4.          // 设置连接超时时间    
    5.         HttpConnectionParams.setConnectionTimeout(httpParams, 30000);    
    6.         // 设置读取超时时间    
    7.         HttpConnectionParams.setSoTimeout(httpParams, 60000);   
    8.   
    9.         SchemeRegistry schemeRegistry = new SchemeRegistry();  
    10.         schemeRegistry.register(  
    11.                  new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));  
    12. //      schemeRegistry.register(  
    13. //               new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));  
    14.         PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);  
    15.         // 设置最大连接数    
    16.         cm.setMaxTotal(200);  
    17.         // 设置每个路由默认最大连接数    
    18.         cm.setDefaultMaxPerRoute(20);  
    19. //      // 设置代理和代理最大路由  
    20. //      HttpHost localhost = new HttpHost("locahost", 80);  
    21. //      cm.setMaxPerRoute(new HttpRoute(localhost), 50);  
    22.         // 设置代理,  
    23.         HttpHost proxy = new HttpHost("10.36.24.3", 60001);  
    24.         httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY,  proxy);  
    25.           
    26.         HttpClient httpClient = new DefaultHttpClient(cm, httpParams);  

    自动重连

       如果某次请求请求失败,可以自动重连

    Java代码  收藏代码
    1. DefaultHttpClient httpClient = new DefaultHttpClient();  
    2.             // 可以自动重连  
    3.             HttpRequestRetryHandler requestRetryHandler2 = new HttpRequestRetryHandler() {    
    4.                 // 自定义的恢复策略    
    5.                 public synchronized boolean retryRequest(IOException exception, int executionCount, HttpContext context) {    
    6.                     // 设置恢复策略,在发生异常时候将自动重试3次    
    7.                     if (executionCount > 3) {      
    8.                         // 超过最大次数则不需要重试      
    9.                         return false;      
    10.                     }      
    11.                     if (exception instanceof NoHttpResponseException) {      
    12.                         // 服务停掉则重新尝试连接      
    13.                         return true;      
    14.                     }      
    15.                     if (exception instanceof SSLHandshakeException) {      
    16.                         // SSL异常不需要重试      
    17.                         return false;      
    18.                     }     
    19.                     HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);    
    20.                     boolean idempotent = (request instanceof HttpEntityEnclosingRequest);    
    21.                     if (!idempotent) {    
    22.                         // 请求内容相同则重试    
    23.                         return true;    
    24.                     }    
    25.                     return false;    
    26.                 }    
    27.             };   
    28.             httpClient.setHttpRequestRetryHandler(requestRetryHandler2);   

    使用自定义ResponseHandler处理返回的请求

    Java代码  收藏代码
    1. HttpClient httpClient = new DefaultHttpClient();  
    2. HttpGet get = new HttpGet(url);  
    3.     // 定义一个类处理URL返回的结果  
    4.     ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {  
    5.         public byte[] handleResponse(HttpResponse response)  
    6.                 throws ClientProtocolException, IOException {  
    7.             HttpEntity entity = response.getEntity();  
    8.             if (entity != null) {  
    9.                 return EntityUtils.toByteArray(entity);  
    10.             } else {  
    11.                 return null;  
    12.             }  
    13.         }  
    14.     };  
    15.     // 不同于 httpClient.execute(request),返回值是HttpResponse;返回值右ResponseHandler决定  
    16.     byte[] charts = httpClient.execute(get, handler);  
    17.     FileOutputStream out = new FileOutputStream(fileName);  
    18.     out.write(charts);  
    19.     out.close();  
    20.   
    21.     httpClient.getConnectionManager().shutdown();  

    参考文献

  • 相关阅读:
    SSH框架整合实现Java三层架构实例(一)
    【面试】MySQL的事务和索引
    Spring在web开发中的应用
    Freemarker 页面静态化技术使用入门案例
    jQuery EasyUI window窗口使用实例
    zTree树形菜单交互选项卡效果实现
    zTree树形菜单使用实例
    jQuery EasyUI 选项卡面板tabs使用实例精讲
    jQuery EasyUI 折叠面板accordion的使用实例
    jQuery EasyUI布局容器layout实例精讲
  • 原文地址:https://www.cnblogs.com/yaowen/p/5446861.html
Copyright © 2011-2022 走看看