http请求工具_Java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;


/**
 * http请求工具
 *
 */
public class HttpTookit {
    private static Log log = LogFactory.getLog(HttpTookit.class);

    /**
     * 执行一个HTTP GET请求,返回请求响应的HTML
     *
     * @param url
     *            请求的URL地址
     * @param queryString
     *            请求的查询参数,可以为null
     * @param charset
     *            字符集
     * @param pretty
     *            是否美化
     * @return 返回请求响应的HTML
     */
    public static String doGet(String url, String queryString, String charset, boolean pretty) {
        StringBuffer response = new StringBuffer();
        HttpClient client = new HttpClient();
        HttpMethod method = new GetMethod(url);
        try {
            if (StringUtils.isNotBlank(queryString)) {
                // 对get请求参数做了http请求默认编码,好像没有任何问题,汉字编码后,就成为%式样的字符串
                method.setQueryString(URIUtil.encodeQuery(queryString));
            }
            client.executeMethod(method);
            if (method.getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                String line;
                while ((line = reader.readLine()) != null) {
                    if (pretty) {
                        response.append(line).append(System.getProperty("line.separator"));
                    } else {
                        response.append(line);
                    }
                }
                reader.close();
            }
        } catch (URIException e) {
            log.error("执行HTTP Get请求时,编码查询字符串“" + queryString + "”发生异常!", e);
            log.error(ExceptionUtils.getStackTrace(e));
        } catch (IOException e) {
            log.error("执行HTTP Get请求" + url + "时,发生异常!", e);
            log.error(ExceptionUtils.getStackTrace(e));
        } finally {
            method.releaseConnection();
        }
        return response.toString();
    }

    /**
     * 执行一个HTTP POST请求,返回请求响应的HTML
     *
     * @param url
     *            请求的URL地址
     * @param params
     *            请求的查询参数,可以为null
     * @param charset
     *            字符集
     * @param pretty
     *            是否美化
     * @return 返回请求响应的HTML
     */
    public static String doPost(String url, Map<String, String> params, String charset, boolean pretty) {
        StringBuffer response = new StringBuffer();
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod(url);

        method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");

        // 设置Http Post数据
        if (params != null) {
            NameValuePair[] nvp = new NameValuePair[params.size()];
            int i = 0;
            for (Map.Entry<String, String> entry : params.entrySet()) {
                NameValuePair n = new NameValuePair();
                n.setName(entry.getKey());
                n.setValue(entry.getValue());
                nvp[i] = n;
                i++;

            }
            method.addParameters(nvp);
        }
        try {
            client.executeMethod(method);
            if (method.getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                String line;
                while ((line = reader.readLine()) != null) {
                    if (pretty) {
                        response.append(line).append(System.getProperty("line.separator"));
                    } else {
                        response.append(line);
                    }
                }
                reader.close();
            } else {
                log.info("执行HTTP Post请求" + url + "时,发生异常!");
                log.info("method.getStatusCode() ==" + method.getStatusCode());

            }
        } catch (IOException e) {
            log.error("执行HTTP Post请求" + url + "时,发生异常!", e);
            log.error(ExceptionUtils.getStackTrace(e));
        } finally {
            method.releaseConnection();
        }
        return response.toString();
    }

    public static String doPost(String url, String xml, String charset) throws UnsupportedEncodingException {
        StringBuffer response = new StringBuffer();
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod(url);

        method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");

        // 设置Http Post数据
        if (xml != null) {
            RequestEntity entity = new StringRequestEntity(xml, "application/json", "UTF-8");
            method.setRequestEntity(entity);
        }
        try {
            client.executeMethod(method);
            if (method.getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                String line;
                while ((line = reader.readLine()) != null) {

                    response.append(line);

                }
                reader.close();
            } else {
                log.info("执行HTTP Post请求" + url + "时,发生异常!");
                log.info("method.getStatusCode() ==" + method.getStatusCode());

            }
        } catch (IOException e) {
            log.error("执行HTTP Post请求" + url + "时,发生异常!", e);
            log.error(ExceptionUtils.getStackTrace(e));
        } finally {
            method.releaseConnection();
        }
        return response.toString();
    }

    public static String call(String url, String xml, String charset, String charsetReturn) throws URISyntaxException, ClientProtocolException, IOException {

        String res = "";
        String reqXml = xml;
        CloseableHttpClient httpclient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        // 设置请求和传输超时时间
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).setSocketTimeout(30 * 1000).build();
        // 尝试3次,最坏的情况是等待30+1+30+2+30=93秒之后还请求失败
        for (int i = 0; i < 3; i++) {
            try {
                URI uri = new URIBuilder(url).build();
                HttpPost httppost = new HttpPost(uri);
                httppost.setConfig(requestConfig);

                StringEntity s = new StringEntity(reqXml, charset);
                s.setContentType("application/json");
                httppost.setEntity(s);
                // log.info("HttpPost StringEntity 中的XML:" +
                // InputStreamUtils.InputStreamTOString(s.getContent(), "GBK"));

                response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                if (entity != null) {

                    res = EntityUtils.toString(entity, charsetReturn);

                    break;
                }
            } catch (RuntimeException e) {
                if (i >= 2) {
                    break;
                }
                try {
                    Thread.sleep((i + 1) * 1000);
                } catch (InterruptedException e1) {
                    log.error(ExceptionUtils.getStackTrace(e1));
                }
            } finally {
                try {
                    response.close();
                    httpclient.close();
                } catch (IOException e) {
                    log.error(ExceptionUtils.getStackTrace(e));

                } catch (RuntimeException e) {
                    log.error(ExceptionUtils.getStackTrace(e));

                }
            }
        }

        return res;
    }

    public static String call(String url, String xml, String charset) throws URISyntaxException, ClientProtocolException, IOException {

        String res = "";
        String reqXml = xml;
        CloseableHttpClient httpclient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        // 设置请求和传输超时时间
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).setSocketTimeout(30 * 1000).build();
        // 尝试3次,最坏的情况是等待30+1+30+2+30=93秒之后还请求失败
        for (int i = 0; i < 3; i++) {
            try {
                URI uri = new URIBuilder(url).build();
                HttpPost httppost = new HttpPost(uri);
                httppost.setConfig(requestConfig);

                StringEntity s = new StringEntity(reqXml, charset);
                s.setContentType("application/json");
                httppost.setEntity(s);
                // log.info("HttpPost StringEntity 中的XML:" +
                // InputStreamUtils.InputStreamTOString(s.getContent(), "GBK"));

                response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                if (entity != null) {

                    res = EntityUtils.toString(entity, "utf-8");

                    break;
                }
            } catch (RuntimeException e) {
                if (i >= 2) {
                    break;
                }
                try {
                    Thread.sleep((i + 1) * 1000);
                } catch (InterruptedException e1) {
                    log.error(ExceptionUtils.getStackTrace(e1));
                }
            } finally {
                try {
                    response.close();
                    httpclient.close();
                } catch (IOException e) {
                    log.error(ExceptionUtils.getStackTrace(e));

                } catch (RuntimeException e) {
                    log.error(ExceptionUtils.getStackTrace(e));

                }
            }
        }

        return res;
    }

    /**
     * 补充空格 参数(str字符串,字段的长度)
     */
    public static String formatStr(String str, int length) throws Exception {
        if (str == null) {
            return null;
        }
        // 空格的长度 = 20 - 字段的长度(GBK)。
        int strLen = str.getBytes("UTF-8").length;
        if (strLen == length) {
            return str;
        } else if (strLen < length) {
            int temp = length - strLen;
            String tem = "";
            for (int i = 0; i < temp; i++) {
                tem = tem + " ";
            }
            return str + tem;
        } else {
            return str.substring(0, length);
        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值