HttpClient模拟postman/浏览器(登录+访问接口)详解编程语言

创建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&param2=yyy&param3=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&param2=yyy&param3=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&param2=yyy&param3=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&param2=yyy&param3=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

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论