• -------------------------------------------------------------
  • ====================================

HttpClient学习系列 — 学习总结

生活 dewbay 6年前 (2019-04-12) 1866次浏览 已收录 0个评论 扫描二维码

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 代码  

HttpClient学习系列 -- 学习总结
  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 代码  

HttpClient学习系列 -- 学习总结
  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 代码  

HttpClient学习系列 -- 学习总结
  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 代码  

HttpClient学习系列 -- 学习总结
  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&#8221;);  
  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 代码  

HttpClient学习系列 -- 学习总结
  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 代码  

HttpClient学习系列 -- 学习总结
  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 代码  

HttpClient学习系列 -- 学习总结
  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 代码  

HttpClient学习系列 -- 学习总结
  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();  

露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:HttpClient学习系列 — 学习总结
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址