您的位置:首页 > 理论基础 > 计算机网络

基于HttpClient的HttpUtils(后台访问URL)

2016-03-20 15:15 525 查看
转载地址:http://lxy19791111.iteye.com/blog/341409

最近做在线支付时遇到需要以后台方式访问URL并获取其返回的数据的问题,在网络上g了一把,发现在常用的还是Apache的HttpClient。因为以经常要用到的原故,因此我对其进行了一些简单的封装,在此将代码贴一来,希望对有需要的朋友有所帮助,呵呵...

 

      HttpUtils.java中有两个公共的静态方法,一个是URLPost,另一个是URLGet,一目了然,前者是提供POST方式提交数据的,后者是提供GET方式提交数据的。其中所需要传送的数据以Map的方式传入,剩下的工作就交给我这个HttpUtils吧!当然如果Http服务器端对所提交的数据的编码有要求的话,也没问题,你可以传入UTF-8或者GBK,当然大家还可自行增加。

 

      下面是源代码,如果使用中有什么问题,欢迎大家提出。

Java代码  


import java.io.IOException;  

import java.io.UnsupportedEncodingException;  

import java.net.URLEncoder;  

import java.util.Iterator;  

import java.util.Map;  

import java.util.Set;  

  

import org.apache.commons.httpclient.HttpClient;  

import org.apache.commons.httpclient.HttpException;  

import org.apache.commons.httpclient.HttpStatus;  

import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;  

import org.apache.commons.httpclient.methods.GetMethod;  

import org.apache.commons.httpclient.methods.PostMethod;  

import org.apache.commons.logging.Log;  

import org.apache.commons.logging.LogFactory;  

  

/** 

 * HTTP工具类 

 *  

 * @author lixiangyang 

 *  

 */  

public class HttpUtils {  

  

    private static Log log = LogFactory.getLog(HttpUtils.class);  

      

    /** 

     * 定义编码格式 UTF-8 

     */  

    public static final String URL_PARAM_DECODECHARSET_UTF8 = "UTF-8";  

      

    /** 

     * 定义编码格式 GBK 

     */  

    public static final String URL_PARAM_DECODECHARSET_GBK = "GBK";  

      

    private static final String URL_PARAM_CONNECT_FLAG = "&";  

      

    private static final String EMPTY = "";  

  

    private static MultiThreadedHttpConnectionManager connectionManager = null;  

  

    private static int connectionTimeOut = 25000;  

  

    private static int socketTimeOut = 25000;  

  

    private static int maxConnectionPerHost = 20;  

  

    private static int maxTotalConnections = 20;  

  

    private static HttpClient client;  

  

    static{  

        connectionManager = new MultiThreadedHttpConnectionManager();  

        connectionManager.getParams().setConnectionTimeout(connectionTimeOut);  

        connectionManager.getParams().setSoTimeout(socketTimeOut);  

        connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionPerHost);  

        connectionManager.getParams().setMaxTotalConnections(maxTotalConnections);  

        client = new HttpClient(connectionManager);  

    }  

      

    /** 

     * POST方式提交数据 

     * @param url 

     *          待请求的URL 

     * @param params 

     *          要提交的数据 

     * @param enc 

     *          编码 

     * @return 

     *          响应结果 

     * @throws IOException 

     *          IO异常 

     */  

    public static String URLPost(String url, Map<String, String> params, String enc){  

  

        String response = EMPTY;          

        PostMethod postMethod = null;  

        try {  

            postMethod = new PostMethod(url);  

            postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);  

            //将表单的值放入postMethod中  

            Set<String> keySet = params.keySet();  

            for(String key : keySet){  

                String value = params.get(key);  

                postMethod.addParameter(key, value);  

            }             

            //执行postMethod  

            int statusCode = client.executeMethod(postMethod);  

            if(statusCode == HttpStatus.SC_OK) {  

                response = postMethod.getResponseBodyAsString();  

            }else{  

                log.error("响应状态码 = " + postMethod.getStatusCode());  

            }  

        }catch(HttpException e){  

            log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);  

            e.printStackTrace();  

        }catch(IOException e){  

            log.error("发生网络异常", e);  

            e.printStackTrace();  

        }finally{  

            if(postMethod != null){  

                postMethod.releaseConnection();  

                postMethod = null;  

            }  

        }  

          

        return response;  

    }  

      

    /** 

     * GET方式提交数据 

     * @param url 

     *          待请求的URL 

     * @param params 

     *          要提交的数据 

     * @param enc 

     *          编码 

     * @return 

     *          响应结果 

     * @throws IOException 

     *          IO异常 

     */  

    public static String URLGet(String url, Map<String, String> params, String enc){  

  

        String response = EMPTY;  

        GetMethod getMethod = null;       

        StringBuffer strtTotalURL = new StringBuffer(EMPTY);  

          

        if(strtTotalURL.indexOf("?") == -1) {  

          strtTotalURL.append(url).append("?").append(getUrl(params, enc));  

        } else {  

            strtTotalURL.append(url).append("&").append(getUrl(params, enc));  

        }  

        log.debug("GET请求URL = \n" + strtTotalURL.toString());  

          

        try {  

            getMethod = new GetMethod(strtTotalURL.toString());  

            getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);  

            //执行getMethod  

            int statusCode = client.executeMethod(getMethod);  

            if(statusCode == HttpStatus.SC_OK) {  

                response = getMethod.getResponseBodyAsString();  

            }else{  

                log.debug("响应状态码 = " + getMethod.getStatusCode());  

            }  

        }catch(HttpException e){  

            log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);  

            e.printStackTrace();  

        }catch(IOException e){  

            log.error("发生网络异常", e);  

            e.printStackTrace();  

        }finally{  

            if(getMethod != null){  

                getMethod.releaseConnection();  

                getMethod = null;  

            }  

        }  

          

        return response;  

    }     

  

    /** 

     * 据Map生成URL字符串 

     * @param map 

     *          Map 

     * @param valueEnc 

     *          URL编码 

     * @return 

     *          URL 

     */  

    private static String getUrl(Map<String, String> map, String valueEnc) {  

          

        if (null == map || map.keySet().size() == 0) {  

            return (EMPTY);  

        }  

        StringBuffer url = new StringBuffer();  

        Set<String> keys = map.keySet();  

        for (Iterator<String> it = keys.iterator(); it.hasNext();) {  

            String key = it.next();  

            if (map.containsKey(key)) {  

                String val = map.get(key);  

                String str = val != null ? val : EMPTY;  

                try {  

                    str = URLEncoder.encode(str, valueEnc);  

                } catch (UnsupportedEncodingException e) {  

                    e.printStackTrace();  

                }  

                url.append(key).append("=").append(str).append(URL_PARAM_CONNECT_FLAG);  

            }  

        }  

        String strURL = EMPTY;  

        strURL = url.toString();  

        if (URL_PARAM_CONNECT_FLAG.equals(EMPTY + strURL.charAt(strURL.length() - 1))) {  

            strURL = strURL.substring(0, strURL.length() - 1);  

        }  

          

        return (strURL);  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: