文章简介
- 分析自己写的代码并总结
- get请求
- 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请求