序
最近这几周,一直在忙同一个项目,刚开始是了解需求,需求有一定了解之后,就开始调第三方的接口。由于第三方给提供的文档很模糊,在调接口的时候,出了很多问题,一直在沟通协调,具体的无奈就不说了,由于接口的访问协议是通过 HTTP 和 HTTPS 通讯的,因此封装了一个简单的请求工具类,由于时间紧迫,并没有额外的时间对工具类进行优化和扩展,如果后续空出时间的话,我会对该工具类继续进行优化和扩展的。
引用
首先说一下该类中需要引入的 jar 包,apache 的 httpclient 包,版本号为 4.5,如有需要的话,可以引一下。
代码
- <span style="font-family:Comic Sans MS;">import org.apache.commons.io.IOUtils;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.config.RequestConfig;
- 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.conn.ssl.SSLConnectionSocketFactory;
- import org.apache.http.conn.ssl.SSLContextBuilder;
- import org.apache.http.conn.ssl.TrustStrategy;
- import org.apache.http.conn.ssl.X509HostnameVerifier;
- import org.apache.http.entity.StringEntity;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.impl.client.HttpClients;
- import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.util.EntityUtils;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLException;
- import javax.net.ssl.SSLSession;
- import javax.net.ssl.SSLSocket;
- import java.io.IOException;
- import java.io.InputStream;
- import java.nio.charset.Charset;
- import java.security.GeneralSecurityException;
- import java.security.cert.CertificateException;
- import java.security.cert.X509Certificate;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- /**
- * HTTP 请求工具类
- *
- * @author : liii
- * @version : 1.0.0
- * @date : 2015/7/21
- * @see : TODO
- */
- public class HttpUtil {
- private static PoolingHttpClientConnectionManager connMgr;
- private static RequestConfig requestConfig;
- private static final int MAX_TIMEOUT = 7000;
- static {
- // 设置连接池
- connMgr = new PoolingHttpClientConnectionManager();
- // 设置连接池大小
- connMgr.setMaxTotal(100);
- connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());
- RequestConfig.Builder configBuilder = RequestConfig.custom();
- // 设置连接超时
- configBuilder.setConnectTimeout(MAX_TIMEOUT);
- // 设置读取超时
- configBuilder.setSocketTimeout(MAX_TIMEOUT);
- // 设置从连接池获取连接实例的超时
- configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);
- // 在提交请求之前 测试连接是否可用
- configBuilder.setStaleConnectionCheckEnabled(true);
- requestConfig = configBuilder.build();
- }
- /**
- * 发送 GET 请求(HTTP),不带输入数据
- * @param url
- * @return
- */
- public static String doGet(String url) {
- return doGet(url, new HashMap<String, Object>());
- }
- /**
- * 发送 GET 请求(HTTP),K-V形式
- * @param url
- * @param params
- * @return
- */
- public static String doGet(String url, Map<String, Object> params) {
- String apiUrl = url;
- StringBuffer param = new StringBuffer();
- int i = 0;
- for (String key : params.keySet()) {
- if (i == 0)
- param.append("?");
- else
- param.append("&");
- param.append(key).append("=").append(params.get(key));
- i++;
- }
- apiUrl += param;
- String result = null;
- HttpClient httpclient = new DefaultHttpClient();
- try {
- HttpGet httpPost = new HttpGet(apiUrl);
- HttpResponse response = httpclient.execute(httpPost);
- int statusCode = response.getStatusLine().getStatusCode();
- System.out.println("执行状态码 : " + statusCode);
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- InputStream instream = entity.getContent();
- result = IOUtils.toString(instream, "UTF-8");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return result;
- }
- /**
- * 发送 POST 请求(HTTP),不带输入数据
- * @param apiUrl
- * @return
- */
- public static String doPost(String apiUrl) {
- return doPost(apiUrl, new HashMap<String, Object>());
- }
- /**
- * 发送 POST 请求(HTTP),K-V形式
- * @param apiUrl API接口URL
- * @param params 参数map
- * @return
- */
- public static String doPost(String apiUrl, Map<String, Object> params) {
- CloseableHttpClient httpClient = HttpClients.createDefault();
- String httpStr = null;
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- try {
- httpPost.setConfig(requestConfig);
- List<NameValuePair> pairList = new ArrayList<>(params.size());
- for (Map.Entry<String, Object> entry : params.entrySet()) {
- NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry
- .getValue().toString());
- pairList.add(pair);
- }
- httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
- response = httpClient.execute(httpPost);
- System.out.println(response.toString());
- HttpEntity entity = response.getEntity();
- httpStr = EntityUtils.toString(entity, "UTF-8");
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 发送 POST 请求(HTTP),JSON形式
- * @param apiUrl
- * @param json json对象
- * @return
- */
- public static String doPost(String apiUrl, Object json) {
- CloseableHttpClient httpClient = HttpClients.createDefault();
- String httpStr = null;
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- try {
- httpPost.setConfig(requestConfig);
- StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题
- stringEntity.setContentEncoding("UTF-8");
- stringEntity.setContentType("application/json");
- httpPost.setEntity(stringEntity);
- response = httpClient.execute(httpPost);
- HttpEntity entity = response.getEntity();
- System.out.println(response.getStatusLine().getStatusCode());
- httpStr = EntityUtils.toString(entity, "UTF-8");
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 发送 SSL POST 请求(HTTPS),K-V形式
- * @param apiUrl API接口URL
- * @param params 参数map
- * @return
- */
- public static String doPostSSL(String apiUrl, Map<String, Object> params) {
- CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- String httpStr = null;
- try {
- httpPost.setConfig(requestConfig);
- List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());
- for (Map.Entry<String, Object> entry : params.entrySet()) {
- NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry
- .getValue().toString());
- pairList.add(pair);
- }
- httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("utf-8")));
- response = httpClient.execute(httpPost);
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
- return null;
- }
- HttpEntity entity = response.getEntity();
- if (entity == null) {
- return null;
- }
- httpStr = EntityUtils.toString(entity, "utf-8");
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 发送 SSL POST 请求(HTTPS),JSON形式
- * @param apiUrl API接口URL
- * @param json JSON对象
- * @return
- */
- public static String doPostSSL(String apiUrl, Object json) {
- CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- String httpStr = null;
- try {
- httpPost.setConfig(requestConfig);
- StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题
- stringEntity.setContentEncoding("UTF-8");
- stringEntity.setContentType("application/json");
- httpPost.setEntity(stringEntity);
- response = httpClient.execute(httpPost);
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
- return null;
- }
- HttpEntity entity = response.getEntity();
- if (entity == null) {
- return null;
- }
- httpStr = EntityUtils.toString(entity, "utf-8");
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 创建SSL安全连接
- *
- * @return
- */
- private static SSLConnectionSocketFactory createSSLConnSocketFactory() {
- SSLConnectionSocketFactory sslsf = null;
- try {
- SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
- public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
- return true;
- }
- }).build();
- sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {
- @Override
- public boolean verify(String arg0, SSLSession arg1) {
- return true;
- }
- @Override
- public void verify(String host, SSLSocket ssl) throws IOException {
- }
- @Override
- public void verify(String host, X509Certificate cert) throws SSLException {
- }
- @Override
- public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
- }
- });
- } catch (GeneralSecurityException e) {
- e.printStackTrace();
- }
- return sslsf;
- }
- /**
- * 测试方法
- * @param args
- */
- public static void main(String[] args) throws Exception {
- }
- }</span>
结束语
工具类封装的比较粗糙,后续还会继续优化的,如果小伙伴们有更好的选择的话,希望也能够分享出来,大家一起学习。
序
最近这几周,一直在忙同一个项目,刚开始是了解需求,需求有一定了解之后,就开始调第三方的接口。由于第三方给提供的文档很模糊,在调接口的时候,出了很多问题,一直在沟通协调,具体的无奈就不说了,由于接口的访问协议是通过 HTTP 和 HTTPS 通讯的,因此封装了一个简单的请求工具类,由于时间紧迫,并没有额外的时间对工具类进行优化和扩展,如果后续空出时间的话,我会对该工具类继续进行优化和扩展的。
引用
首先说一下该类中需要引入的 jar 包,apache 的 httpclient 包,版本号为 4.5,如有需要的话,可以引一下。
代码
- <span style="font-family:Comic Sans MS;">import org.apache.commons.io.IOUtils;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.config.RequestConfig;
- 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.conn.ssl.SSLConnectionSocketFactory;
- import org.apache.http.conn.ssl.SSLContextBuilder;
- import org.apache.http.conn.ssl.TrustStrategy;
- import org.apache.http.conn.ssl.X509HostnameVerifier;
- import org.apache.http.entity.StringEntity;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.impl.client.HttpClients;
- import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.util.EntityUtils;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLException;
- import javax.net.ssl.SSLSession;
- import javax.net.ssl.SSLSocket;
- import java.io.IOException;
- import java.io.InputStream;
- import java.nio.charset.Charset;
- import java.security.GeneralSecurityException;
- import java.security.cert.CertificateException;
- import java.security.cert.X509Certificate;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- /**
- * HTTP 请求工具类
- *
- * @author : liii
- * @version : 1.0.0
- * @date : 2015/7/21
- * @see : TODO
- */
- public class HttpUtil {
- private static PoolingHttpClientConnectionManager connMgr;
- private static RequestConfig requestConfig;
- private static final int MAX_TIMEOUT = 7000;
- static {
- // 设置连接池
- connMgr = new PoolingHttpClientConnectionManager();
- // 设置连接池大小
- connMgr.setMaxTotal(100);
- connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());
- RequestConfig.Builder configBuilder = RequestConfig.custom();
- // 设置连接超时
- configBuilder.setConnectTimeout(MAX_TIMEOUT);
- // 设置读取超时
- configBuilder.setSocketTimeout(MAX_TIMEOUT);
- // 设置从连接池获取连接实例的超时
- configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);
- // 在提交请求之前 测试连接是否可用
- configBuilder.setStaleConnectionCheckEnabled(true);
- requestConfig = configBuilder.build();
- }
- /**
- * 发送 GET 请求(HTTP),不带输入数据
- * @param url
- * @return
- */
- public static String doGet(String url) {
- return doGet(url, new HashMap<String, Object>());
- }
- /**
- * 发送 GET 请求(HTTP),K-V形式
- * @param url
- * @param params
- * @return
- */
- public static String doGet(String url, Map<String, Object> params) {
- String apiUrl = url;
- StringBuffer param = new StringBuffer();
- int i = 0;
- for (String key : params.keySet()) {
- if (i == 0)
- param.append("?");
- else
- param.append("&");
- param.append(key).append("=").append(params.get(key));
- i++;
- }
- apiUrl += param;
- String result = null;
- HttpClient httpclient = new DefaultHttpClient();
- try {
- HttpGet httpPost = new HttpGet(apiUrl);
- HttpResponse response = httpclient.execute(httpPost);
- int statusCode = response.getStatusLine().getStatusCode();
- System.out.println("执行状态码 : " + statusCode);
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- InputStream instream = entity.getContent();
- result = IOUtils.toString(instream, "UTF-8");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return result;
- }
- /**
- * 发送 POST 请求(HTTP),不带输入数据
- * @param apiUrl
- * @return
- */
- public static String doPost(String apiUrl) {
- return doPost(apiUrl, new HashMap<String, Object>());
- }
- /**
- * 发送 POST 请求(HTTP),K-V形式
- * @param apiUrl API接口URL
- * @param params 参数map
- * @return
- */
- public static String doPost(String apiUrl, Map<String, Object> params) {
- CloseableHttpClient httpClient = HttpClients.createDefault();
- String httpStr = null;
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- try {
- httpPost.setConfig(requestConfig);
- List<NameValuePair> pairList = new ArrayList<>(params.size());
- for (Map.Entry<String, Object> entry : params.entrySet()) {
- NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry
- .getValue().toString());
- pairList.add(pair);
- }
- httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
- response = httpClient.execute(httpPost);
- System.out.println(response.toString());
- HttpEntity entity = response.getEntity();
- httpStr = EntityUtils.toString(entity, "UTF-8");
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 发送 POST 请求(HTTP),JSON形式
- * @param apiUrl
- * @param json json对象
- * @return
- */
- public static String doPost(String apiUrl, Object json) {
- CloseableHttpClient httpClient = HttpClients.createDefault();
- String httpStr = null;
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- try {
- httpPost.setConfig(requestConfig);
- StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题
- stringEntity.setContentEncoding("UTF-8");
- stringEntity.setContentType("application/json");
- httpPost.setEntity(stringEntity);
- response = httpClient.execute(httpPost);
- HttpEntity entity = response.getEntity();
- System.out.println(response.getStatusLine().getStatusCode());
- httpStr = EntityUtils.toString(entity, "UTF-8");
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 发送 SSL POST 请求(HTTPS),K-V形式
- * @param apiUrl API接口URL
- * @param params 参数map
- * @return
- */
- public static String doPostSSL(String apiUrl, Map<String, Object> params) {
- CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- String httpStr = null;
- try {
- httpPost.setConfig(requestConfig);
- List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());
- for (Map.Entry<String, Object> entry : params.entrySet()) {
- NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry
- .getValue().toString());
- pairList.add(pair);
- }
- httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("utf-8")));
- response = httpClient.execute(httpPost);
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
- return null;
- }
- HttpEntity entity = response.getEntity();
- if (entity == null) {
- return null;
- }
- httpStr = EntityUtils.toString(entity, "utf-8");
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 发送 SSL POST 请求(HTTPS),JSON形式
- * @param apiUrl API接口URL
- * @param json JSON对象
- * @return
- */
- public static String doPostSSL(String apiUrl, Object json) {
- CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
- HttpPost httpPost = new HttpPost(apiUrl);
- CloseableHttpResponse response = null;
- String httpStr = null;
- try {
- httpPost.setConfig(requestConfig);
- StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题
- stringEntity.setContentEncoding("UTF-8");
- stringEntity.setContentType("application/json");
- httpPost.setEntity(stringEntity);
- response = httpClient.execute(httpPost);
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
- return null;
- }
- HttpEntity entity = response.getEntity();
- if (entity == null) {
- return null;
- }
- httpStr = EntityUtils.toString(entity, "utf-8");
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- EntityUtils.consume(response.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return httpStr;
- }
- /**
- * 创建SSL安全连接
- *
- * @return
- */
- private static SSLConnectionSocketFactory createSSLConnSocketFactory() {
- SSLConnectionSocketFactory sslsf = null;
- try {
- SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
- public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
- return true;
- }
- }).build();
- sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {
- @Override
- public boolean verify(String arg0, SSLSession arg1) {
- return true;
- }
- @Override
- public void verify(String host, SSLSocket ssl) throws IOException {
- }
- @Override
- public void verify(String host, X509Certificate cert) throws SSLException {
- }
- @Override
- public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
- }
- });
- } catch (GeneralSecurityException e) {
- e.printStackTrace();
- }
- return sslsf;
- }
- /**
- * 测试方法
- * @param args
- */
- public static void main(String[] args) throws Exception {
- }
- }</span>
结束语
工具类封装的比较粗糙,后续还会继续优化的,如果小伙伴们有更好的选择的话,希望也能够分享出来,大家一起学习。