木头人的gravatar头像
木头人2017-10-09 21:35:54
httpclient开发遇到的坑

      一个需求要调用第三方接口,在postman上测试的时候,可以说是秒开的,非常流畅,但是后台代码却一直卡在了httpclient.execute()这个方法上了,过了10多秒后给我报了个connecttion time out的异常。我蒙蔽了半天。我查看了一些网上别人写的代码,和自己的对比了半天也不知道神魔问题。开始我怀疑是版本问题,我删除了4.2版本的jar包,代码修改为4.3的语法结果还是一样的问题。就这样反复的折腾一直整个下午也没搞出来,然后问了下公司的一个哥们。他最后给我发了一个web.xml的配置,解决跨域的问题,然后对我说这是总结的经验,就这样做很坚定地告诉我。我郁闷了半天。这是在逗我吗。我写的后台代码,根本就没经过前台发出的请求和跨域有毛线关系。当然这只是心里的想法,还是谢谢哥们的好心。

      最后发现cmd 命令行里面也ping不通,连百度也不能ping通。我才想起来,原来一直用的是公司的云办公,访问的外网都是要通过代理的。这操蛋的调用第三方接口肯定在后台代码也要用代理。然后搜索了一下,果然httpclient有调用代理的方法:

HttpHost targetHost = new HttpHost("localhost", 80, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
        new AuthScope(targetHost.getHostName(), targetHost.getPort()),
        new UsernamePasswordCredentials("username", "password"));
 
// Create AuthCache instance
AuthCache authCache = new BasicAuthCache();
// Generate BASIC scheme object and add it to the local auth cache
BasicScheme basicAuth = new BasicScheme();
authCache.put(targetHost, basicAuth);
 
// Add AuthCache to the execution context
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);

CloseableHttpResponse response = httpclient.execute( targetHost, httpget, context);
try {
        HttpEntity entity = response.getEntity();
 
    } finally {
        response.close();
    }

离成功更进一步,不报connection time out 的异常了,但是返回说代理问题,不管怎麽说问题解决了,代理的问题,后面继续定位是不是账号或密码有问题。

       后来发现是不加content就行了,更新代码如下:

	/**
	 * 
	 * @param url
	 * @param host
	 * @param port
	 * @param account
	 * @param password
	 * @return
	 */
	public static String sendViaProxy(String url, String host, int port,
			String account, String password) {
		HttpHost proxy = new HttpHost(host, port, "http");
		
		CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
		credentialsProvider.setCredentials(
				new AuthScope(proxy.getHostName(), proxy.getPort()),
				new UsernamePasswordCredentials(account, password));
		
		CloseableHttpClient httpClient = HttpClients.custom()
				.setDefaultCredentialsProvider(credentialsProvider)
				.build();
		RequestConfig config = RequestConfig.custom()
				.setConnectTimeout(3000)
				.setConnectionRequestTimeout(3000)
				.setProxy(proxy)
				.build();
		
		HttpGet request = new HttpGet(url);
		request.setConfig(config);
		
		try {
			HttpResponse httpResponse = httpClient.execute(request);
			if (httpResponse.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toString(httpResponse.getEntity(), "utf-8");
			}
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

 


打赏

已有1人打赏

最代码官方的gravatar头像

分享到:

最近浏览
fellowfun2小时前
最代码贡献等级说明
plsmj999昨天
暂无贡献等级
cxh1121昨天
最代码贡献等级说明
暂无贡献等级
hellozhao前天
暂无贡献等级
heian009810月17日
暂无贡献等级
squidgary10月17日
暂无贡献等级
小尾巴10月17日
暂无贡献等级
灬艾希10月17日
最代码贡献等级说明
1820283820810月16日
暂无贡献等级
sunlei19890610月15日
最代码贡献等级说明
jiaowoyuege10月15日
暂无贡献等级
Smart_咚咚10月14日
最代码贡献等级说明
Chen.木难10月13日
最代码贡献等级说明
蓝色魅影10月13日
最代码贡献等级说明
wsh56449406210月13日
最代码贡献等级说明
lovefc10月13日
最代码贡献等级说明
tangbiao198310月13日
最代码贡献等级说明
最代码广告位
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友