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

请求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. Maven Package Plugins And Maven Test

    在使用Maven时候,大家避免不了使用大量插件: 1. maven-compiler-plugin 指定JDK版本和编码方式 ? ?compiler插件能解决2个问题: 第一:指定JDK版本--mav ...

  2. 【CI】CN.一种多尺度协同变异的微粒群优化算法

    [论文标题]一种多尺度协同变异的微粒群优化算法 (2010) [论文作者]陶新民,刘福荣, 刘  玉 , 童智靖 [论文链接]Paper(14-pages // Single column) [摘要] ...

  3. jquery添加未来元素时,其绑定事件不起作用解决办法

    delegate说起对未来元素是其作用的,于是写下代码: <!DOCTYPE HTML> <html> <head> <meta charset=" ...

  4. LVS负载均衡之持久性连接介绍(session篇)

    在实际生产环境中,往往需要根据业务应用场景来设置lvs的会话超时时间以及防session连接丢失的问题提,如在业务支付环节,如若session丢失会导致重复扣款问题,严重影响到安全性,本小节解将会讲到 ...

  5. ceph iscsi (SCST)

    ceph结合iscsi iscsi Target 安装 1.安装SCST tar -jxf scst-3.0.1.tar.bz2 cd scst-3.0.1 make && make ...

  6. Using Repository Pattern in Entity Framework

    One of the most common pattern is followed in the world of Entity Framework is “Repository Pattern”. ...

  7. IntelliJ IDEA 缺少 javax 包 支持

    在初次使用 IntelliJ IDEA 中,当你使用javax.servlet包下的类时(例:javax.servlet.http.HttpServlet), 在你会发现在IntelliJ IDEA里 ...

  8. iOS扩大UIButton按钮的可点击区域

    一.开发中遇到的问题 我们在开发时有时遇到这中情况:UI给的图片很小,button的点击区域要求比较大.如果用 setBackgroundImage: 方式设置图片会导致图片也跟着button的fra ...

  9. 【Linux】字符转换命令tr

    tr (traslate的缩写)可以用来删除一段信息当中的文字,或者是进行文字信息的替换! [root@www ~]# tr [-ds] SET1 ... 选项与参数: -d :删除信息当中的 SET ...

  10. TCP连接的TIME_WAIT过多导致 Tomcat 假死

    最近发现使用的Tomcat 7会经常假死.前端点击页面无任何反应,打开firebug,很多链接一直在等待服务器的反应.查看服务器的状态,CPU占用很少,最多不超过10%,一般只有2%,3%左右,内存占 ...