java 利用httpclient 3.1 和 httpclient4.1.2发送post请求

来源:互联网 发布:c语言 extern static 编辑:程序博客网 时间:2024/04/28 20:42

ttpclient3和httpclient4都有连接池的概念,但两个版本的接口相差较大。


使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接


httpclient3

MultiThreadedHttpConnectionManager HTTP Client中用来复用连接的连接管理类,可以通过以下方法创建一个client实例

[java] view plain copy
  1. MultiThreadedHttpConnectionManager n =  new MultiThreadedHttpConnectionManager();    
  2. HttpClient client = new HttpClient(n);   
以下是httpclient整体类

[java] view plain copy
  1. public class HttpClientUtils {  
  2.     /** 
  3.      * 日志处理类 
  4.      */  
  5.     private static final Log logger = LogFactory.getLog(HttpClientUtils.class);  
  6.   
  7.     // 读取超时  
  8.     private final static int SOCKET_TIMEOUT = 30000;  
  9.     // 连接超时  
  10.     private final static int CONNECTION_TIMEOUT = 30000;  
  11.     // 每个HOST的最大连接数量(连接至目的主机的线程数)  
  12.     private final static int MAX_CONN_PRE_HOST = 2;  
  13.     // 连接池的最大连接数(相当于线程数)  
  14.     private final static int MAX_CONN = 2;  
  15.     // 连接池  
  16.     private final static HttpConnectionManager httpConnectionManager;  
  17.       
  18.     HttpClient httpClient;  
  19.   
  20.     static {  
  21.         httpConnectionManager = new MultiThreadedHttpConnectionManager();  
  22.         HttpConnectionManagerParams params = httpConnectionManager.getParams();  
  23.         params.setConnectionTimeout(CONNECTION_TIMEOUT);  
  24.         params.setSoTimeout(SOCKET_TIMEOUT);  
  25.         params.setDefaultMaxConnectionsPerHost(MAX_CONN_PRE_HOST);  
  26.         params.setMaxTotalConnections(MAX_CONN);  
  27.         httpClient = new HttpClient(httpConnectionManager);  
  28.   
  29.  }  
  30.   
  31.     /** 
  32.      * 发送主要方法,异常捕获 
  33.      *  
  34.      * @param post 
  35.      * @param code 
  36.      * @return 
  37.      */  
  38.     public static String doHttpPostRequest(PostMethod post) {  
  39.         String resultString = "";  
  40.         try {  
  41.             httpClient.executeMethod(post);  
  42.             if (post.getStatusCode() == HttpStatus.SC_OK) {  
  43.                 resultString = post.getResponseBodyAsString();  
  44.             }  
  45.         } catch (HttpException e) {  
  46.             logger.error("http请求超时", e);  
  47.         } catch (IOException e) {  
  48.             logger.error("IO超时", e);  
  49.         } finally {  
  50.             post.releaseConnection();  
  51.         }  
  52.         return resultString;  
  53.     }  
  54.   
  55.     /** 
  56.      * 设置一下返回错误的通用提示,可以自定义格式. 
  57.      *  
  58.      * @param reason 
  59.      * @return 
  60.      */  
  61.     public static String returnError(String reason) {  
  62.         StringBuffer buffer = new StringBuffer();  
  63.         buffer.append("<?xml version=\"1.0\" encoding=\"GBK\"?>");  
  64.         buffer.append("<Response>");  
  65.         buffer.append("<Success>false</Success>");  
  66.         buffer.append("<reason>");  
  67.         buffer.append(reason);  
  68.         buffer.append("</reason>");  
  69.         buffer.append("</Response>");  
  70.         return buffer.toString();  
  71.     }  
  72.   
  73.     public final static String REQUEST_HEADER = "x-forwarded-for";  
  74.   
  75.     /** 
  76.      * 将客户IP写入请求头 这个设置可以伪装IP请求,注意使用 
  77.      *  
  78.      * @param client 
  79.      * @param ip 
  80.      * @return 
  81.      */  
  82.     public static void resetRequestHeader(HttpClient client, String ip) {  
  83.         List<Header> headers = new ArrayList<Header>();  
  84.         headers.add(new Header(REQUEST_HEADER, ip));  
  85.         client.getHostConfiguration().getParams().setParameter("http.default-headers", headers);  
  86.     }  
  87. }  
以下是测试程序

[java] view plain copy
  1. public class HttpClientTest {  
  2.       
  3.     /**  
  4.      * 组装参数,这里用Map,一键一值比较通用,可以当做共用方法  
  5.      * @param params  
  6.      * @return  
  7.      */    
  8.     private NameValuePair[] buildNameValuePairs(Map<String, String> params) {    
  9.         Object[] keys = params.keySet().toArray();    
  10.         NameValuePair[] pairs = new NameValuePair[keys.length];    
  11.     
  12.         for (int i = 0; i < keys.length; i++) {    
  13.             String key = (String) keys[i];    
  14.             pairs[i] = new NameValuePair(key, params.get(key));    
  15.         }    
  16.     
  17.         return pairs;    
  18.     }   
  19.       
  20.     /** 
  21.      * 执行一个HTTP POST请求,返回请求响应的HTML 
  22.      *  
  23.      * @param url 
  24.      *            请求的URL地址 
  25.      * @param params 
  26.      *            请求的查询参数,可以为null 
  27.      * @return 返回请求响应的string 
  28.      */  
  29.     public String doPost(String url, Map<String, String> params){  
  30.         String response = "";  
  31.         if (null == url || "".equals(url.trim())) {    
  32.             return HttpClientUtil.returnError("推送地址错误[url=" + url + "]");    
  33.         }    
  34.         if (null == code || "".equals(code.trim())) {    
  35.             return HttpClientUtil.returnError("编码错误[code=" + code + "]");    
  36.         }    
  37.             
  38.         if (null == params || params.size() == 0) {    
  39.             return HttpClientUtil.returnError("无传递参数[params.size = 0]");    
  40.         }   
  41.         PostMethod postMethod = new PostMethod(url);  
  42.         postMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");  
  43.         //设置失败重复提交次数  
  44.         postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(5true));  
  45.           
  46.         postMethod.setRequestBody(buildNameValuePairs(params));  
  47.         response = HttpClientUtils.doHttpPostRequest(postMethod);  
  48.         return response;  
  49.     }  
  50.   
  51.     public static void main(String[] args) {  
  52.         String url = "http://localhost/serlvet";   
  53.         String xml = "xxxxxxxxxxxxxxxxxxxxxxx";    
  54.         HashMap<String, String> params = new HashMap<String, String>();    
  55.         params.put("aaaa", xml);    
  56.         params.put("bbbb""bbbxxxx");    
  57.         String r = new HttpClientTest().doPost(url,params);    
  58.         System.out.println(r);    
  59.   
  60.     }  
  61.   
  62. }  
httpclient4.1.2

[java] view plain copy
  1. public class HttpClientUtils2 implements Runnable{  
  2.     private static final Log logger = LogFactory.getLog(HttpClientUtils2.class);  
  3.     private static ThreadSafeClientConnManager cm = null;  
  4.     static {  
  5.         int maxTotal = 20;  
  6.         int defaultMaxConnection = 50;  
  7.         SchemeRegistry schemeRegistry = new SchemeRegistry();  
  8.         schemeRegistry.register(new Scheme("http"80, PlainSocketFactory.getSocketFactory()));  
  9.         cm = new ThreadSafeClientConnManager(schemeRegistry);  
  10.         try {  
  11.             cm.setMaxTotal(maxTotal);  
  12.             // 每条通道的并发连接数设置(连接池)  
  13.             cm.setDefaultMaxPerRoute(defaultMaxConnection);  
  14.         } catch (NumberFormatException e) {  
  15.             e.printStackTrace();  
  16.         }  
  17.     }  
  18.   
  19.     public static HttpClient getHttpClient() {  
  20.         HttpParams params = new BasicHttpParams();  
  21.         params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);  
  22.         params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000); // 3000ms  
  23.         params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 30000); // 3000ms  
  24.         return new DefaultHttpClient(cm, params);  
  25.     }  
  26.   
  27.     public static void release() {  
  28.         if (cm != null) {  
  29.             cm.shutdown();  
  30.         }  
  31.     }  
  32.   
  33.     public static void doHttpPostRequest(String url) {  
  34.         InputStream in = null;  
  35.         HttpResponse response;  
  36.                       
  37.         HttpClient client = getHttpClient();  
  38.         try {  
  39.             response = client.execute(post);  
  40.             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
  41.                 HttpEntity entity = response.getEntity();  
  42.                 long l = entity.getContentLength();  
  43.                 //将返回转换成string(方法1)  
  44.                 in = entity.getContent();  
  45.                 int count = 0;      
  46.                 while (count == 0) {      
  47.                     count = Integer.parseInt(""+entity.getContentLength());//in.available();      
  48.                 }      
  49.                 byte[] bytes = new byte[count];      
  50.                 int readCount = 0// 已经成功读取的字节的个数      
  51.                 while (readCount <= count) {      
  52.                     if(readCount == count)break;      
  53.                     readCount += in.read(bytes, readCount, count - readCount);      
  54.                 }      
  55.                 //将返回转换成string(方法2)  
  56.                 //System.out.println(EntityUtils.toString(entity));    
  57.             }  
  58.             if (in != null) {  
  59.                 //关闭连接,否则连接池消耗完  
  60.                 in.close();  
  61.             }  
  62.         } catch (ClientProtocolException e) {  
  63.             e.printStackTrace();  
  64.         } catch (IOException e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.     }  
  68. }  
测试程序

[java] view plain copy
  1. public class HttpClient2Test {  
  2.           
  3.     /** 
  4.      * 执行一个HTTP POST请求,返回请求响应的HTML 
  5.      *  
  6.      * @param url 
  7.      *            请求的URL地址 
  8.      * @param params 
  9.      *            请求的查询参数,可以为null 
  10.      * @return 返回请求响应的string 
  11.      */  
  12.     public String doPost(String url, Map<String, String> params){  
  13.         String response = "";  
  14.         HttpPost post = new HttpPost(url);  
  15.         // 设置post编码  
  16.         post.getParams().setParameter("http.protocol.content-charset", HTTP.UTF_8);  
  17.         post.getParams().setParameter(HTTP.CONTENT_ENCODING, HTTP.UTF_8);  
  18.         post.getParams().setParameter(HTTP.CHARSET_PARAM, HTTP.UTF_8);  
  19.         post.getParams().setParameter(HTTP.DEFAULT_PROTOCOL_CHARSET, HTTP.UTF_8);  
  20.         try {  
  21.             post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));  
  22.         } catch (UnsupportedEncodingException e1) {  
  23.             // TODO Auto-generated catch block  
  24.             e1.printStackTrace();  
  25.         }  
  26.         response = HttpClientUtils2.doHttpPostRequest(postMethod);  
  27.         return response;  
  28.     }  
  29.   
  30.     public static void main(String[] args) {  
  31.         String url = "http://localhost/serlvet";   
  32.         String xml = "xxxxxxxxxxxxxxxxxxxxxxx";    
  33.         // 设置参数  
  34.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  35.         params.add(new BasicNameValuePair("abc""xml"));  
  36.         String r = new HttpClientTest().doPost(url,params);    
  37.         System.out.println(r);    
  38.   
  39.     }  
  40.   
  41. }  

0 0