• HTTP请求客户端工具类


    1.maven 引入依赖

    <dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
    </dependency>

    2.HTTP请求客户端工具类代码

    package com.vx.springbootexcel.common.utils;

    import org.apache.commons.httpclient.*;
    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.HttpConnectionManagerParams;
    import org.apache.commons.httpclient.params.HttpMethodParams;
    import org.apache.commons.lang3.StringUtils;
    import org.hibernate.validator.internal.util.StringHelper;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.zip.GZIPInputStream;

    /**
    * HTTP请求客户端工具类
    *
    * @author yaojz
    * @version 1.0
    */
    public class HttpClientUtil {

    // protected static InnerLogger logger = new GpLoggerWrapper().new InnerLogger(HttpClientUtil.class);
    private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
    private static HttpClient httpClient;
    private static int HTTP_TIMEOUT = 60000;

    private HttpClientUtil() {
    }

    private final static HttpClient getInstance() {
    if (httpClient == null) {
    MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
    HttpConnectionManagerParams params = new HttpConnectionManagerParams();
    params.setConnectionTimeout(HTTP_TIMEOUT);
    params.setSoTimeout(HTTP_TIMEOUT);
    params.setMaxTotalConnections(10000);
    params.setDefaultMaxConnectionsPerHost(1000);
    connectionManager.setParams(params);
    httpClient = new HttpClient(connectionManager);
    httpClient.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, true));
    }
    return httpClient;
    }

    /**
    * 通过HTTP协议请求
    *
    * @param url 不能为空
    * @param parameters 可为空
    * @return 目标地址响应内容
    * @throws Exception 网络异常
    */
    public static String getRequest_ResponseBodyAsString(String url, Map<String, String> parameters) throws Exception {
    if (url == null) {
    logger.warn(" the url is null");
    return "";
    }
    String params = parameterToString(parameters, "utf-8");
    logger.debug("HttpGet请求:" + url + (params != null ? url.contains("?") ? "&" + params : "?" + params : ""));
    GetMethod method = new GetMethod(url + (params != null ? url.contains("?") ? "&" + params : "?" + params : ""));
    int statusCode;
    try {
    // method.addRequestHeader("Accept-Encoding", "gzip, deflate");
    statusCode = HttpClientUtil.getInstance().executeMethod(method);
    if (statusCode != HttpStatus.SC_OK) {
    logger.error("Method failed: " + method.getStatusLine());
    throw new Exception("请求的服务器有异常:服务器状态码为" + statusCode);
    }
    if (method.getResponseHeader("Content-Encoding") != null) {
    String acceptEncoding = method.getResponseHeader("Content-Encoding").getValue();
    if (acceptEncoding.toLowerCase().indexOf("gzip") > -1) {
    // 建立gzip解压工作流
    StringBuffer sb = new StringBuffer();
    InputStream is = method.getResponseBodyAsStream();
    GZIPInputStream gzin = new GZIPInputStream(is);
    InputStreamReader isr = new InputStreamReader(gzin); // 设置读取流的编码格式
    // ,
    // 自定义编码
    BufferedReader br = new BufferedReader(isr);
    String tempbf;
    while ((tempbf = br.readLine()) != null) {
    sb.append(tempbf);
    sb.append(" ");
    }
    isr.close();
    gzin.close();
    return sb.toString();
    }

    }
    return method.getResponseBodyAsString();
    } catch (Throwable e) {
    throw new Exception("Http服务链路异常:" + e.getMessage(), e);
    } finally {
    method.releaseConnection();
    }
    }

    public static String streamRequest_ResponseBodyAsString(String url, String param) throws Exception {
    if (StringHelper.isNullOrEmptyString(url)) {
    logger.warn(" the url is null");
    return "";
    }
    logger.debug("Http写流请求:" + url + (param != null ? url.contains("?") ? "&" + param : "?" + param : ""));
    OutputStream out = null;
    BufferedReader in = null;
    String result = "";
    try {
    URL realUrl = new URL(url);
    // 打开和URL之间的连接
    HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
    // 设置通用的请求属性
    conn.setRequestProperty("accept", "*/*");
    conn.setRequestProperty("Content-Length", "" + Integer.toString(param.getBytes().length));
    conn.setRequestProperty("Content-Type", "text/xml;charset=utf8");
    conn.setRequestProperty("connection", "Keep-Alive");
    conn.setRequestMethod("POST");
    // 发送POST请求必须设置如下两行
    conn.setDoOutput(true);
    conn.setReadTimeout(60000);
    conn.setConnectTimeout(60000);
    conn.setDoInput(true);
    // 获取URLConnection对象对应的输出流
    out = conn.getOutputStream();
    // 发送请求参数
    out.write(param.getBytes("UTF-8"));
    // flush输出流的缓冲
    out.flush();
    // 定义BufferedReader输入流来读取URL的响应
    in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = in.readLine()) != null) {
    result += " " + line;
    }
    conn.disconnect();
    } catch (Throwable e) {
    throw new Exception("Http服务链路异常:" + e.getMessage(), e);
    } finally {
    try {
    if (out != null) {
    out.close();
    }
    if (in != null) {
    in.close();
    }
    } catch (IOException e) {
    logger.error(e.getMessage(), e);
    }
    }
    return result;
    }

    public static String postRequest_ResponseBodyAsString(String url, Map<String, String> parameters) throws Exception {
    if (StringHelper.isNullOrEmptyString(url)) {
    logger.warn(" the url is null");
    return "";
    }
    logger.debug("HttpPost请求:" + url + (parameters != null ? url.contains("?") ? "&" + parameters : "?" + parameters : ""));

    PostMethod method = new PostMethod(url);
    int statusCode;
    try {
    for (String key : parameters.keySet()) {
    method.addParameter(key, parameters.get(key));
    }
    method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
    statusCode = HttpClientUtil.getInstance().executeMethod(method);
    if (statusCode != HttpStatus.SC_OK) {
    logger.error("Method failed: " + method.getStatusLine());
    throw new Exception("Http服务链路异常:服务器状态码为" + statusCode);
    }
    return method.getResponseBodyAsString();
    } catch (Throwable e) {
    throw new Exception("Http服务链路异常:" + e.getMessage(), e);
    } finally {
    method.releaseConnection();
    }
    }

    /**
    * 以POST方式发送请求
    *
    * @param url
    * @param parameters
    * @return 返回字节内容
    * @throws Exception
    */
    public static byte[] postRequest_ResponseBodyAsBytes(String url, Map<String, String> parameters) throws Exception {
    logger.debug("HttpPost请求:" + url + (parameters != null ? url.contains("?") ? "&" + parameters : "?" + parameters : ""));
    PostMethod method = new PostMethod(url);
    int statusCode;
    try {
    for (String key : parameters.keySet()) {
    method.addParameter(key, parameters.get(key));
    }
    method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
    // method.setRequestHeader("Accept-Encoding", "gzip, deflate");
    statusCode = httpClient.executeMethod(method);
    if (statusCode != HttpStatus.SC_OK) {
    logger.error("Method failed: " + method.getStatusLine());
    throw new Exception("Http服务链路异常:服务器状态码为" + statusCode);
    }
    return method.getResponseBody();
    } catch (Throwable e) {
    throw new Exception("Http服务链路异常:" + e.getMessage(), e);
    } finally {
    // Release the connection.
    method.releaseConnection();
    }
    }

    /**
    * 以POST方式发送请求
    *
    * @param url
    * @param parameters
    * @return 返回流
    * @throws Exception
    */
    public static InputStream postRequest_ResponseBodyAsStream(String url, Map<String, String> parameters) throws Exception {
    logger.debug("HttpPost请求:" + url + (parameters != null ? url.contains("?") ? "&" + parameters : "?" + parameters : ""));
    PostMethod method = new PostMethod(url);
    int statusCode;
    try {
    for (String key : parameters.keySet()) {
    method.addParameter(key, parameters.get(key));
    }
    method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
    // method.setRequestHeader("Accept-Encoding", "gzip, deflate");
    statusCode = httpClient.executeMethod(method);
    if (statusCode != HttpStatus.SC_OK) {
    logger.error("Method failed: " + method.getStatusLine());
    throw new Exception("Http服务链路异常:服务器状态码为" + statusCode);
    }
    return method.getResponseBodyAsStream();
    } catch (Throwable e) {
    throw new Exception("Http服务链路异常:" + e.getMessage(), e);
    } finally {
    // Release the connection.
    method.releaseConnection();
    }
    }

    // 对参数编码组合成一个get请求参数串
    private static String parameterToString(Map<String, String> parameters, String input_charset) {
    if (parameters != null) {
    StringBuffer result = new StringBuffer();
    List<String> keys = new ArrayList<String>(parameters.keySet());
    for (int i = 0; i < keys.size(); i++) {
    try {
    String key = (String) keys.get(i);
    String value = (String) parameters.get(key);
    if (i == keys.size() - 1) {
    result.append(key).append("=").append(URLEncoder.encode(value, input_charset));
    } else {
    result.append(key).append("=").append(URLEncoder.encode(value, input_charset)).append("&");
    }
    } catch (UnsupportedEncodingException e) {
    logger.error(e.getMessage(), e);
    }
    }
    return result.toString();
    }
    return null;
    }

    /**
    * 通过HTTP协议请求
    *
    * @param url 不能为空
    * @param postBody 不能为空
    * @param tokenId
    * @return 目标地址响应内容
    * @throws Exception 网络异常
    */
    public static String postJSONRequest(String url, String postBody,String tokenId) throws Exception {
    if (StringHelper.isNullOrEmptyString(url)) {
    logger.warn(" the url is null");
    return "";
    }
    logger.debug("HttpPost请求:" + url + postBody);
    PostMethod method = new PostMethod();
    try {
    method.setURI(new URI(url, true, "UTF-8"));
    } catch (URIException e1) {
    throw new Exception("解析URL出错:" + url);
    } catch (NullPointerException e1) {
    throw new Exception("解析URL出错:" + url);
    }
    method.setRequestHeader("Content-type", "application/json; charset=UTF-8");
    if(StringUtils.isNotBlank(tokenId)){
    method.setRequestHeader("tokenId", tokenId);
    }
    RequestEntity requestEntity = new StringRequestEntity(postBody);
    method.setRequestEntity(requestEntity);
    int statusCode;
    try {
    statusCode = HttpClientUtil.getInstance().executeMethod(method);
    if (statusCode != HttpStatus.SC_OK) {
    logger.error("Method failed: " + method.getStatusLine());
    throw new Exception("请求的服务器有异常:服务器状态码为" + statusCode);
    }
    BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), method.getResponseCharSet()));
    StringBuffer sb = new StringBuffer();
    int chari2;
    while ((chari2 = in.read()) != -1) {
    sb.append((char) chari2);
    }
    return sb.toString();
    } catch (Throwable e) {
    throw new Exception("Http服务链路异常:" + e.getMessage(), e);
    } finally {
    if (method != null) {
    method.releaseConnection();
    }
    }
    }

    public static String streamRequest_ResponseBodyAsStringWithUTF8(String url, String param) throws Exception {
    if (StringHelper.isNullOrEmptyString(url)) {
    logger.warn(" the url is null");
    return "";
    }
    logger.debug("Http写流请求:" + url + (param != null ? url.contains("?") ? "&" + param : "?" + param : ""));
    OutputStream out = null;
    BufferedReader in = null;
    String result = "";
    try {
    URL realUrl = new URL(url);
    // 打开和URL之间的连接
    HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
    // 设置通用的请求属性
    conn.setRequestProperty("accept", "*/*");
    conn.setRequestProperty("Content-Length", "" + Integer.toString(param.getBytes().length));
    conn.setRequestProperty("Content-Type", "text/xml;charset=utf8");
    conn.setRequestProperty("connection", "Keep-Alive");
    conn.setRequestMethod("POST");
    // 发送POST请求必须设置如下两行
    conn.setDoOutput(true);
    conn.setReadTimeout(60000);
    conn.setConnectTimeout(60000);
    conn.setDoInput(true);
    // 获取URLConnection对象对应的输出流
    out = conn.getOutputStream();
    // 发送请求参数
    out.write(param.getBytes("UTF-8"));
    // flush输出流的缓冲
    out.flush();
    // 定义BufferedReader输入流来读取URL的响应
    in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    String line;
    while ((line = in.readLine()) != null) {
    result += " " + line;
    }
    conn.disconnect();
    } catch (Throwable e) {
    throw new Exception("Http服务链路异常:" + e.getMessage(), e);
    } finally {
    try {
    if (out != null) {
    out.close();
    }
    if (in != null) {
    in.close();
    }
    } catch (IOException e) {
    logger.error(e.getMessage(), e);
    }
    }
    return result.trim();
    }

    }
  • 相关阅读:
    用Web标准进行开发
    哪个是你爱情的颜色?
    由你的指纹,看你的性格。
    让你受用一辈子的181句话
    漂亮MM和普通MM的区别
    ASP构造大数据量的分页SQL语句
    随机码的生成
    爱从26个字母开始 (可爱的史努比)
    浅谈自动采集程序及入库
    值得收藏的JavaScript代码
  • 原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/11044435.html
Copyright © 2020-2023  润新知