Httpclient

文章简介

  1. 分析自己写的代码并总结
  2. get请求
  3. post请求

分析自己写的代码并总结

  • 一般使用步骤
    参考文章:https://www.jianshu.com/p/375be5929bed
使用HttpClient发送请求、接收响应,一般需要以下步骤。
HttpGet请求响应的一般步骤:
1). 创建HttpClient对象,可以使用HttpClients.createDefault();
2). 如果是无参数的GET请求,则直接使用构造方法HttpGet(String url)创建HttpGet对象即可;
如果是带参数GET请求,则可以先使用URIBuilder(String url)创建对象,再调用addParameter(String param, String value),或setParameter(String param, String value)来设置请求参数,并调用build()方法构建一个URI对象。只有构造方法HttpGet(URI uri)来创建HttpGet对象。
3). 创建HttpResponse,调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()可以获取响应状态码。
4). 释放连接。

HttpPost请求响应的一般步骤:
1). 创建HttpClient对象,可以使用HttpClients.createDefault();
2). 如果是无参数的GET请求,则直接使用构造方法HttpPost(String url)创建HttpPost对象即可;
如果是带参数POST请求,先构建HttpEntity对象并设置请求参数,然后调用setEntity(HttpEntity entity)创建HttpPost对象。
3). 创建HttpResponse,调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()可以获取响应状态码。
4). 释放连接。
  • 代码
package com.zhangxiaoguang.utils;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public class HttpClientUtil {

	public static String doGet(String url, Map<String, String> param) {

		// 创建Httpclient对象
		CloseableHttpClient httpclient = HttpClients.createDefault();

		String resultString = "";
		CloseableHttpResponse response = null;
		try {
			// 创建uri
			URIBuilder builder = new URIBuilder(url);
			if (param != null) {
				for (String key : param.keySet()) {
					builder.addParameter(key, param.get(key));
				}
			}
			URI uri = builder.build();

			// 创建http GET请求
			HttpGet httpGet = new HttpGet(uri);

			// 执行请求
			response = httpclient.execute(httpGet);
			// 判断返回状态是否为200
			if (response.getStatusLine().getStatusCode() == 200) {
				resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (response != null) {
					response.close();
				}
				httpclient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return resultString;
	}

	public static String doGet(String url) {
		return doGet(url, null);
	}

	public static String doPost(String url, Map<String, String> param) {
		// 创建Httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		String resultString = "";
		try {
			// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			// 创建参数列表
			if (param != null) {
				List<NameValuePair> paramList = new ArrayList<>();
				for (String key : param.keySet()) {
					paramList.add(new BasicNameValuePair(key, param.get(key)));
				}
				// 模拟表单
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
				httpPost.setEntity(entity);
			}
			// 执行http请求
			response = httpClient.execute(httpPost);
			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				response.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return resultString;
	}

	public static String doPost(String url) {
		return doPost(url, null);
	}
	
	public static String doPostJson(String url, String json) {
		// 创建Httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		String resultString = "";
		try {
			// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			// 创建请求内容
			StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
			httpPost.setEntity(entity);
			// 执行http请求
			response = httpClient.execute(httpPost);
			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				response.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return resultString;
	}
}

第二篇;

public class HttpClientUtils {

    private HttpClientUtils() {
    }

    private volatile static HttpClientUtils instance = null;

    private PoolingHttpClientConnectionManager cm;
    private Timer conncetionMonitor;
    private RequestConfig defaultRequestConfig;

    private int REQUEST_TIMEOUT = 5 * 1000;
    private int REQUEST_SOCKET_TIME = 20 * 1000;

    /**
     * 默认每个路由最大连接数,默认5。
     */
    private int defaultMaxPerRoute = 100;
    /**
     * 最大连接数,默认20。
     */
    private int maxTotal = 100;

    private boolean init() {
        try {
            Properties properties = SystemConfigUtil.getProperties();
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            String keyStoreClientPath = properties.getProperty("keyStoreClientPath");
            InputStream ksIn = new FileInputStream(keyStoreClientPath);

            String keyStorePass = properties.getProperty("keyStorePass");

            keyStore.load(ksIn, keyStorePass.toCharArray());

            SSLContext sslcontext = SSLContexts.createDefault();

            // 咪咕单点要求客户端提供证书认证
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(keyStore, keyStorePass.toCharArray());

            X509TrustManager x509mgr = getX509TrustManager();
            // 取消服务端证书认证
            sslcontext.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{ x509mgr }, null);


            // 客户端支持TLSv1,指定TLS_RSA_WITH_AES_128_CBC_SHA加密算法
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
                    new String[]{"TLSv1"},
                    new String[] {"TLS_RSA_WITH_AES_128_CBC_SHA"},
                    new HostnameVerifier() {
                        @Override
                        public boolean verify(String s, SSLSession sslSession) {
                            return true;
                        }
                    }); // 跳过客户端验证服务器身份的策略

//            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
//                    new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"}, null,
//                    new HostnameVerifier() {
//                        @Override
//                        public boolean verify(String s, SSLSession sslSession) {
//                            return true;
//                        }
//                    }); // 跳过客户端验证服务器身份的策略


            // Create a registry of custom connection socket factories for supported
            // protocol schemes.
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE)
                    .register("https", sslsf).build();

            cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
            cm.setDefaultMaxPerRoute(defaultMaxPerRoute);
            cm.setMaxTotal(maxTotal);

            final int idleTimeOut = 30;
            conncetionMonitor = new Timer();
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    // 关闭失效的连接
                    cm.closeExpiredConnections();
                    // 关闭N秒内部活动的连接
                    cm.closeIdleConnections(idleTimeOut, TimeUnit.SECONDS);
                }
            };
            // 每5秒检测一次
            conncetionMonitor.schedule(task, 5000, 10000);

            defaultRequestConfig = RequestConfig.custom().setSocketTimeout(REQUEST_SOCKET_TIME)
                    .setConnectTimeout(REQUEST_TIMEOUT).setConnectionRequestTimeout(REQUEST_TIMEOUT)
                    .build();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private X509TrustManager getX509TrustManager() {
        return new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
    }

    public static HttpClientUtils getInstance() {
        if (instance == null) {
            synchronized (HttpClientUtils.class) {
                if (instance == null) {
                    HttpClientUtils clientUtils = new HttpClientUtils();
                    if (clientUtils.init()) {
                        instance = clientUtils;
                    }
                }
            }
        }

        return instance;
    }


    public void destory() {
        if (conncetionMonitor != null) {
            conncetionMonitor.cancel();
        }
        if (cm != null) {
            cm.close();
        }
    }

    private CloseableHttpClient getHttpclient() {
        return HttpClients.custom().setConnectionManager(cm)
                .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)).build();
    }

    public JSONObject executePostJSON(String url, JSONObject jsonObject) {

        JSONObject respJson = new JSONObject();
        String result = "000";
        String desc = "成功";
        String respData = "";

        CloseableHttpClient httpClient = null;
        CloseableHttpResponse resp = null;
        HttpEntity entity = null;
        try {
            httpClient = getHttpclient();
            HttpPost httppost = createHttpPost(url);
            if (jsonObject != null) {
                HttpEntity httpEntity = new StringEntity(jsonObject.toString(), ContentType.APPLICATION_JSON);
                httppost.setEntity(httpEntity);
            }

            resp = httpClient.execute(httppost);
            int statusCode = resp.getStatusLine().getStatusCode();
            entity = resp.getEntity();
            if (200 == statusCode) {
                respData = EntityUtils.toString(entity);
            } else {
                result = "001";
                desc = "statusCode 为 " + statusCode;
            }
        } catch (Exception e) {
            result = "001";
            desc = "异常:" + CommonUtil.getExceptionInfo(e);
        } finally {
            if (entity != null) {
                try {
                    entity.getContent().close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            try {
                if (resp != null) {
                    resp.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        respJson.put("url", url);
        respJson.put("result", result);
        respJson.put("desc", desc);
        respJson.put("reqData", jsonObject);
        respJson.put("respData", respData);
        return respJson;
    }

    /**
     *
     * @param url
     * @param param
     * @return
     */
    public JSONObject executeGetJSON(String url, Map<String, String> param) {

        JSONObject respJson = new JSONObject();
        String result = "000";
        String desc = "成功";
        String respData = "";

        CloseableHttpClient httpClient = null;
        CloseableHttpResponse resp = null;
        HttpEntity entity = null;
        try {
            httpClient = getHttpclient();

            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();

            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);

            // 执行请求
            resp = httpClient.execute(httpGet);

            int statusCode = resp.getStatusLine().getStatusCode();
            entity = resp.getEntity();
            if (200 == statusCode) {
                respData = EntityUtils.toString(entity);
            } else {
                result = "001";
                desc = "statusCode 为 " + statusCode;
            }
        } catch (Exception e) {
            result = "001";
            desc = "异常:" + CommonUtil.getExceptionInfo(e);
        } finally {
            if (entity != null) {
                try {
                    entity.getContent().close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            try {
                if (resp != null) {
                    resp.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        respJson.put("url", url);
        respJson.put("result", result);
        respJson.put("desc", desc);
        respJson.put("reqData", JSONObject.fromObject( param ));
        respJson.put("respData", respData);
        return respJson;


    }
        private HttpPost createHttpPost(String url) {
        HttpPost httpPost = new HttpPost(url);
        httpPost.setConfig(RequestConfig.copy(defaultRequestConfig).build());
        return httpPost;
    }
}
  • 总结
    注:访问第三方接口返回的数据肯定是HttpEntity对象,需解析成想要对象
    不管是get或者是post请求,只有创建get或者post请求对象方式不一样,其他是一样的。
    1.涉及到对象:
    ①创建Httpclient对象:CloseableHttpClient
    ②访问后响应对象:CloseableHttpResponse
    返回状态:response.getStatusLine().getStatusCode()
    返回HttpEntity对象数据(特殊的是post请求数据也是封装到这个对象):response.getEntity()
    返回json字符串数据:
    ③请求参数
    get请求:可以分装到URIBuilder对象中或者加载url路径上
    post请求:分装到http协议的请求内容里面(先模拟表单或者直接封装到HttpEntity)
 post:
 第一种:
 			// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			// 创建参数列表
			if (param != null) {
				List<NameValuePair> paramList = new ArrayList<>();
				for (String key : param.keySet()) {
					paramList.add(new BasicNameValuePair(key, param.get(key)));
				}
				// 模拟表单
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
				httpPost.setEntity(entity);
第二种:         
                HttpEntity httpEntity = new StringEntity(jsonObject.toString(), ContentType.APPLICATION_JSON);
                httppost.setEntity(httpEntity);

2.创建get或者post请求对象方式
请求参数是map:

创建get请求:带参数
			// 创建uri
			URIBuilder builder = new URIBuilder(url);
			if (param != null) {
				for (String key : param.keySet()) {
					builder.addParameter(key, param.get(key));
				}
			}
			URI uri = builder.build();

			// 创建http GET请求
			HttpGet httpGet = new HttpGet(uri);

			// 执行请求
			response = httpclient.execute(httpGet);
创建post请求:带参数(模拟表单)
		// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			// 创建参数列表
			if (param != null) {
				List<NameValuePair> paramList = new ArrayList<>();
				for (String key : param.keySet()) {
					paramList.add(new BasicNameValuePair(key, param.get(key)));
				}
				// 模拟表单
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
				httpPost.setEntity(entity);
			}
			// 执行http请求
			response = httpClient.execute(httpPost);
创建post请求:带参数(请求参数是json字符串)
 HttpEntity httpEntity = new StringEntity(jsonObject.toString(), ContentType.APPLICATION_JSON);
                httppost.setEntity(httpEntity);            
            resp = httpClient.execute(httppost);

get请求

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值