记得之前在公众号提过曾经在 T 公司做 Java 爬虫,有读者对爬虫的实现很感兴趣。在 Java 应用中读取远程 URL 内容是一个比较常见的需求,可以使用 Apache 旗下的开源项目 Httpclient 来实现。
Httpclient 基于 Java 语言,实现了 HTTP 1.0 和 HTTP 1.1 协议。实现了 GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE 等全部方法。支持使用代理建立连接。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。能够自动处理 cookie,支持用 KeepAlive 来保持持久连接。
使用 Httpclient 很简单,在如下的示例代码中,分为以下几个步骤:
CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet("http://www.baidu.com"); CloseableHttpResponse response = httpclient.execute(httpGet); try { System.out.println(response.getStatusLine()); HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.toString(entity)); } finally { response.close(); }
发送 get 请求,需要创建 HttpGet 请求。发送 post 请求,需要创建 HttpPost 请求。如果是带参数的请求,可以直接拼接在 URL 中,也可以使用 URIBuilder 创建对象然后通过 addParameter 或 setParameter 方法添加 。如果需要设置请求 header,可以调用 addHeader 或 setHeader 方法设置 header。
对于 post 请求,可以调用 setEntity 方法设置请求的数据。如 post.setEntity(new StringEntity(body, "utf-8"))。支持提交多种数据:
调用 HttpClient 的 execute 方法发送请求,返回的是一个 HttpResponse 对象。通过该对象可以获取返回的所有数据:
HttpClient 支持设置 RequestConfig 来配置请求默认参数。一般使用 RequestConfig.Builder 来构建 RequestConfig。Builder 支持进行如下设置:
RequestConfig 构建后,需要调用 HttpClient setDefaultRequestConfig 方法设置到客户端中。
通过 RequestConfig.setProxy 可以设置请求的代理,在爬虫等场景非常实用。代理的对象类型是 HttpHost,一般设置代理的 ip 和端口。如果代理有密码,可以使用 CredentialsProvider 配置用户名和密码自动完成认证。
CredentialsProvider credsProvider = new BasicCredentialsProvider(); //使用密码的代理端口 credsProvider.setCredentials(new AuthScope(null,port), //用户名和密码 new UsernamePasswordCredentials(username,password) ); httpClientBuilder.setDefaultCredentialsProvider(credsProvider);
请求 HTTPS 需要在 HttpClient 中设置 ssl 协议。主要分为以下几个步骤:
如果请求报错 HTTPS 证书问题,可以设置忽略证书。设置系统变量 System.setProperty("jsse.enableSNIExtension", "false"); 即可。
// 需要通过以下代码声明对https连接支持 SSLContext sslcontext = SSLContexts.custom() .loadTrustMaterial(null, new TrustSelfSignedStrategy()) .build(); // SSL 连接工厂 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE); RegistrysocketFactoryRegistry = RegistryBuilder .create() .register("http",PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslsf).build(); // 初始化连接管理器 PoolingHttpClientConnectionManager poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); client = HttpClients.custom() .setConnectionManager(poolConnManager) .build();
本文来源:程序之心,转载请注明出处!
本书是国际知名的高等学校计算机科学及相关专业基础课教材,也是非常受欢迎的计算机入门读物。该教材是一本百科全书式的计算机专业入门指南,涉及计算机科学的方方面面。虽然读者对象是计算机专业的学生,但这本书深入浅出、引人入胜,勾画出了计算机科学体系的框架,可以为有志于IT行业的学生奠定计算机科学知识的基础,架设进一步深入专业理论学习的桥梁。
最新内容
© 2016 - 2024 chengxuzhixin.com All Rights Reserved.