轻松把玩HttpClient之设置代理,可以访问FaceBook

前面的文章介绍了一些HttpClient的简单示例,本文继续采用示例的方式来演示HttpClient的功能。

在项目中我们可能会遇到这样的情况:为了保证系统的安全性,只允许使用特定的代理才可以访问,而与这些系统使用HttpClient进行交互时,只能为其配置代理。

这里我们使用goagent代理访问脸书来模拟这种情况。facebook由于某些原因被封,只能通过代理来访问,所以正好也符合我们现在的演示需求。现在在浏览器上访问是可以访问的:

可以看到facebook采用的也是https的方式,而且该网站的证书不客户端被信任。所以我们要采用“绕过证书验证”的方式使用Https。那如何设置代理呢,官网有相关的示例。我采用的跟官网提供的稍微不一样,具体代码如下:

	/**
	 * 设置代理
	 * @param builder
	 * @param hostOrIP
	 * @param port
	 */
	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);
	}

返回值是HttpClientBuilder,这个类是用来生成HttpClient对象的,同时可以设置各种参数,这里提供返回值是为了配置代理后,继续配置ssl。打开goagent,看看代理ip的设定如图:

现在修改send方法:

	/**
	 * 模拟请求
	 *
	 * @param url		资源地址
	 * @param map	参数列表
	 * @param encoding	编码
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws KeyManagementException
	 * @throws IOException
	 * @throws ClientProtocolException
	 */
	public static String send(String url, Map<String,String> map,String encoding) throws KeyManagementException, NoSuchAlgorithmException, ClientProtocolException, IOException {
		String body = "";

		//绕过证书验证,处理https请求
		SSLContext sslcontext = createIgnoreVerifySSL();

        // 设置协议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("127.0.0.1", 8087).setConnectionManager(connManager).build();
//		CloseableHttpClient client = HttpClients.createDefault();

		//创建post方式请求对象
		HttpPost httpPost = new HttpPost(url);

		//装填参数
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();
		if(map!=null){
			for (Entry<String, String> entry : map.entrySet()) {
				nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
			}
		}
		//设置参数到请求对象中
		httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));

		System.out.println("请求地址:"+url);
		System.out.println("请求参数:"+nvps.toString());

		//设置header信息
		//指定报文头【Content-type】、【User-Agent】
		httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
		httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

		//执行请求操作,并拿到结果(同步阻塞)
		CloseableHttpResponse response = client.execute(httpPost);
		//获取结果实体
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			//按指定编码转换结果实体为String类型
			body = EntityUtils.toString(entity, encoding);
		}
		EntityUtils.consume(entity);
		//释放链接
		response.close();
        return body;
	}

测试代码如下:

	public static void main(String[] args) throws ParseException, IOException, KeyManagementException, NoSuchAlgorithmException{
		String url = "https://www.facebook.com/";
		String body = send(url, null, "utf-8");
		System.out.println("交易响应结果");
		System.out.println(body);
	}

运行后,结果:

果然可以访问成功了。

好了基本的教程就到这里,下篇我将其封装的一个工具类,自认为相对于网上分享的封装类要强大很多,敬请期待吧。

版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载请声明:【转自 http://blog.csdn.net/xiaoxian8023 】

时间: 2024-10-14 17:54:34

轻松把玩HttpClient之设置代理,可以访问FaceBook的相关文章

轻松把玩HttpClient之封装HttpClient工具类(三),插件式配置Header

上篇文章介绍了插件式配置HttpClient,本文将介绍插件式配置Header. 为什么要配置header在前面已经提到了,还里再简单说一下,要使用HttpClient模拟请求,去访问各种接口或者网站资源,都有可能有各种限制,比如说java客户端模拟访问csdn博客,就必须设置User-Agent,否则就报错了.还有各种其他情况,必须的设置一些特定的Header,才能请求成功,或者才能不出问题. 好了就说这么多,本次还是采用构造者模式的级联调用方式,来完成该工具类.在该工具类中,为所有常用的Ht

轻松把玩HttpClient之封装HttpClient工具类(二),插件式配置HttpClient对象

上一篇文章中,简单分享一下封装HttpClient工具类的思路及部分代码,本文将分享如何实现插件式配置HttpClient对象. 如果你看过我前面的几篇关于HttpClient的文章或者官网示例,应该都知道HttpClient对象在创建时,都可以设置各种参数,但是却没有简单的进行封装,比如对我来说比较重要的3个:代理.ssl(包含绕过证书验证和自定义证书验证).超时.还需要自己写.所以这里我就简单封装了一下,顺便还封装了一个连接池的配置. 其实说是插件式配置,那是高大上的说法,说白了,就是采用了

轻松把玩HttpClient之封装HttpClient工具类(六),封装输入参数,简化工具类

在写这个工具类的时候发现传入的参数太多,以至于方法泛滥,只一个send方法就有30多个,所以对工具类进行了优化,把输入参数封装在一个对象里,这样以后再扩展输入参数,直接修改这个类就ok了. 不多说了,先上代码: /** * 请求配置类 * * @author arron * @date 2016年2月2日 下午3:14:32 * @version 1.0 */ public class HttpConfig { private HttpConfig(){}; /** * 获取实例 * @retu

轻松把玩HttpClient之封装HttpClient工具类(四),单线程调用及多线程批量调用测试

本文主要来分享一下该工具类的测试结果.工具类的整体源码不再单独分享,源码基本上都已经在文章中了.开始我们的测试. 单线程调用测试: public static void testOne() throws HttpProcessException{ System.out.println("--------简单方式调用(默认post)--------"); String url = "http://tool.oschina.net/"; //简单调用 String re

轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求

最近更新了一下HttpClientUtil工具类代码,主要是添加了一个参数HttpContext,这个是用来干嘛的呢?其实是用来保存和传递Cookie所需要的.因为我们有很多时候都需要登录,然后才能请求一些想要的数据.而在这以前使用HttpClientUtil工具类,还不能办到.现在更新了以后,终于可以了. 先说一下思路:本次的demo,就是获取csdn中的c币,要想获取c币,必须先登录.而每次登录需要5个参数.其中2个必不可少的参数是用户名和密码,其他的3个参数,是需要从登录页面获取的.在第一

轻松把玩HttpClient之封装HttpClient工具类(七),新增验证码识别功能

这个HttpClientUtil工具类分享在GitHub上已经半年多的时间了,并且得到了不小的关注,有25颗star,被fork了38次.有了大家的鼓励,工具类一直也在完善中.最近比较忙,两个多月前的修改在今天刚修改测试完成,今天再次分享给大家. 验证码识别这项技术并不是本工具类的功能,而是通过一个开源的api来识别验证码的.这里做了一个简单的封装,主要是用来解决登陆时的验证码的问题.在线验证码识别官网:http://lab.ocrking.com/,github地址:https://githu

C#:WebBrowser控件设置代理IP访问网站【附源码】

软件截图 源码下载 http://download.csdn.net/detail/php_fly/8041731 作者 新浪微博:http://weibo.com/cstmr 作   者:曾是土木人 转载请注明出处:http://www.cnblogs.com/hongfei/p/webbrowser-proxy-ip.html

轻松把玩HttpAsyncClient之模拟post请求示例

如果看到过我前些天写过的<轻松把玩HttpClient之模拟post请求示例>这篇文章,你再看本文就是小菜一碟了,如果你顺便懂一些NIO,基本上是毫无压力了.因为HttpAsyncClient相对于HttpClient,就多了一个NIO,这也是为什么支持异步的原因. 不过我有一个疑问,虽说NIO是同步非阻塞IO,但是HttpAsyncClient提供了回调的机制,这点儿跟netty很像,所以可以模拟类似于AIO的效果.但是官网上的例子却基本上都是使用Future<HttpResponse

windows 的cmd设置代理的问题

今天给公司一同事用cmd来安装gulp(npm install -g gulp), 死活安装不上,一直报一大堆的错误:经仔细查阅是代理的问题,故总结如下: 若公司的电脑是通过设置代理来访问外网,则需要为cmd设置代理: 1.首先打开 cmd (win + R,输入 cmd,然后按 enter 键) 2.输入以下命令 set http_proxy=http://127.0.0.1:1189 set https_proxy=http://127.0.0.1:1189 其中": "后面的为自