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/tech/pnotes/19601.html

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

相关推荐

发表回复

登录后才能评论