创建HttpClient实例时应用了单例模式(饿汉式)
package com.jake.autotest.util;
import com.jake.autotest.constant.BpmUatConstants;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.*;
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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.ArrayList;
public class HttpClientUtils {
private static CloseableHttpClient client = HttpClients.createDefault();
static {
HttpPost loginPost = new HttpPost(BpmUatConstants.LOGIN_URL);
ArrayList<NameValuePair> loginPairs = new ArrayList<>();
loginPairs.add(new BasicNameValuePair("username", BpmUatConstants.USERNAME));
loginPairs.add(new BasicNameValuePair("password", BpmUatConstants.PASSWORD));
try {
loginPost.setEntity(new UrlEncodedFormEntity(loginPairs, "utf-8"));
client.execute(loginPost);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 以Get请求方式访问需要事先登录的HTTP接口
* @param url HTTP接口的URL
* @param paramStr 请求参数的字符串形式:"param1=xxx¶m2=yyy¶m3=zzz"
* @return 访问HTTP接口得到的Json数据
*/
public static String visitByGet(String url, String paramStr) {
String json = null;
try {
URIBuilder uriBuilder = new URIBuilder(url);
if (StringUtils.isNotEmpty(paramStr)) {
ArrayList<NameValuePair> paramPairs = getNameValuePairs(paramStr);
uriBuilder.setParameters(paramPairs);
}
HttpGet visitGet = new HttpGet(uriBuilder.build());
CloseableHttpResponse visitResponse = client.execute(visitGet);
json = EntityUtils.toString(visitResponse.getEntity());
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
/**
* 以Post请求方式访问需要事先登录的HTTP接口
* @param url HTTP接口的URL
* @param paramStr 请求参数的字符串形式:"param1=xxx¶m2=yyy¶m3=zzz"
* @return 访问HTTP接口得到的Json数据
*/
public static String visitByPost(String url, String paramStr) {
String json = null;
try {
HttpPost visitPost = new HttpPost(url);
if (StringUtils.isNotEmpty(paramStr)) {
ArrayList<NameValuePair> paramPairs = getNameValuePairs(paramStr);
visitPost.setEntity(new UrlEncodedFormEntity(paramPairs, "utf-8"));
}
HttpResponse visitResponse = client.execute(visitPost);
json = EntityUtils.toString(visitResponse.getEntity());
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
/**
* 1. 把传入参数"param1=xxx¶m2=yyy¶m3=zzz"以&为分离点拆分为params数组,其中
* params[0]="param1=xxx", params[1]="param2=yyy", param[2]="param3=zzz"
* 2. 由1可以看出,params数组的每一个元素都是name-value对的字符串形式,以=为分离点将该数组
* 拆分为一个长度为2的数组nv(name-value),其中,nv[0], nv[1]分别对应BasicNameValuePair
* 构造方法的第一、二个参数。
* @param paramStr 请求参数的字符串形式:"param1=xxx¶m2=yyy¶m3=zzz"
* @return HttpClient执行HttpPost或HttpGet请求所需的NameValuePair对象集合
*/
private static ArrayList<NameValuePair> getNameValuePairs(String paramStr) {
ArrayList<NameValuePair> paramPairs = new ArrayList<>();
String[] params = paramStr.split("&");
for (String param: params) {
String[] nv = param.split("=");
if (nv.length == 2) {
paramPairs.add(new BasicNameValuePair(nv[0], nv[1]));
}
}
return paramPairs;
}
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/19601.html