在调用公司的某个接口时,直接通过浏览器配置代理服务器可以请求到如下数据:

请求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配置代理服务器模拟浏览器发送请求调用接口测试的更多相关文章

  1. 20200726_java爬虫_使用HttpClient模拟浏览器发送请求

    浏览器获取数据: 打开浏览器 ==> 输入网址 ==> 回车查询 ==> 返回结果 ==> 浏览器显示结果数据 HttpClient获取数据: 创建HttpClient ==& ...

  2. telnet客户端模拟浏览器发送请求

    telnet 客户端 telnet客户端能够发出请求去连接服务器(模拟浏览器) 使用telnet之前,需要开启telnet客户端 1.进入控制面板 2.进入程序和功能,选择打开或关闭windows功能 ...

  3. Java基础教程——模拟浏览器发送请求

    JAVA访问网页 分别测试使用get和post方法访问网页,可以收到服务器的请求,并写入到html文件中. import java.io.*; import java.net.*; import ja ...

  4. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

    Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...

  5. java模拟浏览器发送请求

    package test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOExcep ...

  6. httpClient模拟浏览器发请求

    一.介绍 httpClient是Apache公司的一个子项目, 用来提高高效的.最新的.功能丰富的支持http协议的客户端编程工具包.完成可以模拟浏览器发起请求行为. 二.简单使用例子 : 模拟浏览器 ...

  7. php使用curl模拟多线程发送请求

    每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...

  8. java 模拟浏览器发送post请求

    java使用URLConnection发送post请求 /** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求 ...

  9. 基于nodejs模拟浏览器post请求爬取json数据

    今天想爬取某网站的后台传来的数据,中间遇到了很多阻碍,花了2个小时才请求到数据,所以我在此总结了一些经验. 首先,放上我所爬取的请求地址http://api.chuchujie.com/api/?v= ...

随机推荐

  1. 从零实现Lumen-JWT扩展包(序):前因

    转自:https://zhuanlan.zhihu.com/p/22531819?refer=lsxiao 最近这段时间我寻思着把几个月前爬下来的6万多首诗词曲文做成一个API,免费开放给大家用. 这 ...

  2. WinPE无法识别NVMe SSD硬盘,如何重装系统

    (源自网络出处不详) 抽风,diy一台新机器,下载的win10系统安装时出现如题所示的问题,开始以为是主板的问题设置u盘启动也不行,后来在某个群里有人说是系统版本问题,无奈重新做了启动优盘(用的17年 ...

  3. 理解metrics.classification_report

    混淆矩阵是一个矩阵,类别个数可以有多个,a[i][j]表示将类别i的样本误判为类别j的个数. classification_report用来分析不同类别的准确率,召回率,F1值等,从而便于按照类别查看 ...

  4. 浅谈bitmap算法

    一.bitmap算法思想 32位机器上,一个整形,比如int a; 在内存中占32bit位,可以用对应的32bit位对应十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询.  ...

  5. SpringBoot配置属性转载地址

    SpringBoot配置属性系列 SpringBoot配置属性之MVC SpringBoot配置属性之Server SpringBoot配置属性之DataSource SpringBoot配置属性之N ...

  6. android异步处理机制

    昨天面试被提问android的异步处理机制有哪些,他说处理new thread还有哪种方式,我说implement runnable,他说不是,比如intentservice. 我说那还有asyncT ...

  7. SQLAlchemy(1) -- Python的SQLAlchemy和ORM

    Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...

  8. 解决WIN32窗口不响应WM_LBUTTONDBLCLK消息

    原文链接: http://www.cnblogs.com/xukaixiang/archive/2012/05/27/2520059.html 今天在做一个软件时,发现win32创建的窗体不能响应WM ...

  9. SharePoint中在线编辑文档

    我一直以为只有在Document Library里面的File才会支持在线编辑.直到今天早上我才发现用IE打开List里面的Attachments也是支持在线编辑的,但前提是必须是IE浏览器. 目前正 ...

  10. Microsoft.ACE.OLEDB.12.0 及其在 MSSQL中的使用

    1.Microsoft.ACE.OLEDB.12.0 简介 就是一个数据访问接口,用于在office文件和非office应用程序间传输数据.例如 Microsoft Office Access 201 ...