使用HttpClient配置代理服务器模拟浏览器发送请求调用接口测试
在调用公司的某个接口时,直接通过浏览器配置代理服务器可以请求到如下数据:
请求url地址:http://wwwnei.xuebusi.com/rd-interface/getsales.jsp?cid=12007036
<Root>
<Result>1</Result>
<Message></Message>
<SalesLevel>
<![CDATA[KU6]]>
</SalesLevel>
<BranchId>
<![CDATA[]]>
</BranchId>
<ENName>
<![CDATA[jamie.liu]]>
</ENName>
<Mobile>
<![CDATA[]]>
</Mobile>
<BranchCompany>
<![CDATA[集团总部]]>
</BranchCompany>
<Telephone>
<![CDATA[010-58344688-65578]]>
</Telephone>
<Email>
<![CDATA[jamie.liu@xuebusi.com]]>
</Email>
<CNName>
<![CDATA[张三]]>
</CNName>
<CityForLive800>
<![CDATA[集团总部]]>
</CityForLive800>
</Root>
但是,在java代码中,没有配置代理服务器的情况下,直接使用HttpClient测试请求该接口时,却返回如下数据:
Active connections: 1
server accepts handled requests
786216 786216 788311
Reading: 0 Writing: 1 Waiting: 0
解决方案:
使用HttpClient模拟浏览器发送请求时,配置自己公司的代理服务器地址和端口号,然后接口就能正常返回了。
import com.xuebusi.ihr.core.utils.HttpClientUtil;
import com.xuebusi.ihr.core.utils.Xml2Json;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
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.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
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.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* http使用代理服务器发送请求测试类
* Created by SYJ on 2017/9/19.
*/
public class HttpProxyTest { public static void main(String[] args) throws ParseException, IOException, KeyManagementException, NoSuchAlgorithmException {
String saleUserInfoXml = getSaleUserInfoXml();
System.out.println("\nxml转成json格式:\n" + saleUserInfoXml); } /**
* 测试调用rd查询销售顾问信息接口
* 将接口返回的xml格式数据转成json
* @return
*/
public static String getSaleUserInfoXml() {
String url = "http://wwwnei.xuebusi.com/rd-interface/getsales.jsp";
HashMap<String, Object> map = new HashMap<>();
map.put("cid", "12007036");
String responseBody;
String xml2JsonStr = "";
try {
responseBody = send(url, map, "utf-8");
System.out.println("\n接口返回xml格式数据:\n" + responseBody);
xml2JsonStr = Xml2Json.xml2Json(responseBody).toJSONString();
} catch (Exception e) {
e.printStackTrace();
}
return xml2JsonStr;
} /**
* 设置代理
*
* @param hostOrIP
* @param port
* @return
*/
public static HttpClientBuilder proxy(String hostOrIP, int port) {
// 依次是代理地址,代理端口号,协议类型
HttpHost proxy = new HttpHost(hostOrIP, port, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
return HttpClients.custom().setRoutePlanner(routePlanner);
} /**
* 模拟请求
*
* @param url 资源地址
* @param map 参数列表
* @param encoding 编码
*/
public static String send(String url, Map<String, Object> map, String encoding) throws Exception {
String body = "";
SSLContext sslcontext = createIgnoreVerifySSL();//绕过证书验证,处理https请求
// 设置协议http和https对应的处理socket链接工厂的对象
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(sslcontext))
.build();
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
HttpClients.custom().setConnectionManager(connManager); //创建自定义的httpclient对象,指定自己公司的代理服务器地址和端口号
CloseableHttpClient client = proxy("192.168.20.6", 3128).setConnectionManager(connManager).build();
//CloseableHttpClient client = HttpClients.createDefault(); HttpGet httpGet = buildHttpGet(url, map); //设置header信息
httpGet.setHeader("Content-Type", "text/xml;charset=UTF-8");
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"); try {
CloseableHttpResponse response = client.execute(httpGet);//执行请求操作,并拿到结果(同步阻塞)
HttpEntity entity = response.getEntity();//获取结果实体
if (entity != null) {
body = EntityUtils.toString(entity, encoding);//按指定编码转换结果实体为String类型
}
EntityUtils.consume(entity);
response.close();//释放链接
} catch (IOException e) {
e.printStackTrace();
}
return body;
} /**
* httpGet传参
*
* @param url
* @param params
* @return
*/
public static HttpGet buildHttpGet(String url, Map<String, Object> params) {
String parmStr = HttpClientUtil.getUrlParamsByMap(params);
try {
url = HttpClientUtil.urlFormat(url, parmStr, "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return new HttpGet(url);
} /**
* httpPost传参
*
* @param url
* @param params
* @return
*/
public static HttpPost buildHttpPost(String url, Map<String, Object> params) {
HttpPost httpPost = new HttpPost(url);//创建post方式请求对象
List<NameValuePair> nvps = new ArrayList<>();//装填参数
if (params != null) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
nvps.add(new BasicNameValuePair(entry.getKey(), (String) entry.getValue()));
}
}
try {
//设置参数到请求对象中
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("请求地址:" + url + "请求参数:" + nvps.toString());
return httpPost;
} /**
* 绕过验证
*
* @return
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSLv3"); // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sc.init(null, new TrustManager[]{trustManager}, null);
return sc;
}
}
上面只是在本地测试调用预上线接口时的解决方案,实际上将项目部署到公司预上线时,是不需要配置代理服务器的,直接使用HttpClient就可以正常调用的,也能正常返回xml格式数据。
使用HttpClient配置代理服务器模拟浏览器发送请求调用接口测试的更多相关文章
- 20200726_java爬虫_使用HttpClient模拟浏览器发送请求
浏览器获取数据: 打开浏览器 ==> 输入网址 ==> 回车查询 ==> 返回结果 ==> 浏览器显示结果数据 HttpClient获取数据: 创建HttpClient ==& ...
- telnet客户端模拟浏览器发送请求
telnet 客户端 telnet客户端能够发出请求去连接服务器(模拟浏览器) 使用telnet之前,需要开启telnet客户端 1.进入控制面板 2.进入程序和功能,选择打开或关闭windows功能 ...
- Java基础教程——模拟浏览器发送请求
JAVA访问网页 分别测试使用get和post方法访问网页,可以收到服务器的请求,并写入到html文件中. import java.io.*; import java.net.*; import ja ...
- htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容
Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...
- java模拟浏览器发送请求
package test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOExcep ...
- httpClient模拟浏览器发请求
一.介绍 httpClient是Apache公司的一个子项目, 用来提高高效的.最新的.功能丰富的支持http协议的客户端编程工具包.完成可以模拟浏览器发起请求行为. 二.简单使用例子 : 模拟浏览器 ...
- php使用curl模拟多线程发送请求
每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...
- java 模拟浏览器发送post请求
java使用URLConnection发送post请求 /** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求 ...
- 基于nodejs模拟浏览器post请求爬取json数据
今天想爬取某网站的后台传来的数据,中间遇到了很多阻碍,花了2个小时才请求到数据,所以我在此总结了一些经验. 首先,放上我所爬取的请求地址http://api.chuchujie.com/api/?v= ...
随机推荐
- Swift与C类型对应关系表
每一个 C 语言基本类型, Swift 都提供了与之对应的类型. 在 Swift 中调用 C 方法的时候,会用到这些类型: C 类型 Swift 对应类型 别名 bool CBool Bool cha ...
- sqlserver查询数据表中每个类别最新的一条记录
表tariff_info, 原始数据: 想要的结果:以start_time时间倒序排序, 以code分类, 查询每一类最新的一条记录 sql: SELECT a.* FROM TARIFF_INFO ...
- ajax请求格式
ajax请求格式........... var rowsData = $('#receiptPrintList').datagrid('getSelections'); $.ajax({ type: ...
- ubuntu(14.04) sphinx安装
http://portal.digitser.cn/article-179-1.html
- uploadify.js参数说明(转)
一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...
- elk之elasticsearch 入门
一.概述: 1.查看elasticsearch集群的健康状况: [root@node115 kibana]# curl -X GET http://192.168.39.115:9200/_cat/h ...
- linux 下 pip 安装教程
方法一: 下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 这就 ...
- js scrollIntoView 滚动到元素可视区域
老是忘记这个函数名,记录一下啊 // 滚动到可视区域 document.querySelector(".loading").scrollIntoView()
- Appium升级后安装UnicodeIME-debug.apk 提示
使用appium1.8 ,启动app过程中报错: 2018-05-08 17:09:16:890 - [W3C] Encountered internal error running command: ...
- jenkins执行shell命令提示找不到命令解决办法
用jenkins执行shell脚本,执行一条命令: #唤醒休眠手机 adb shell input keyevent 提示: [adb] $ /bin/sh -xe /Users/xxxxx/tool ...