一、HttpClient介绍

  虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是它没有提供足够的灵活性和其他应用程序需要的功能。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

二、使用范例(以下版本4.3)

  1,通过get方式,请求网页内容。我们首先创建httpclient对象,然后通过httpclient来执行http get方法,httpresponse获得服务端响应的所有内容,httpentity为获取的网页消息体。

        CloseableHttpClient httpclient = HttpClients.createDefault();
try {
// 以get方法执行请求
HttpGet httpGet = new HttpGet(“http://localhost/”);
// 获得服务器响应的所有信息
CloseableHttpResponse responseGet = httpclient.execute(httpGet);
try {
System.out.println(responseGet.getStatusLine());
// 获得服务器响应的消息体(不包括http head)
HttpEntity entity = responseGet.getEntity(); if (entity != null) {
// 获得响应字符集编码
ContentType contentType = ContentType.getOrDefault(entity);
Charset charset = contentType.getCharset();
InputStream is = entity.getContent();
// 将inputstream转化为reader,并使用缓冲读取,还可按行读取内容
BufferedReader br = new BufferedReader(
new InputStreamReader(is, charset));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
is.close();
}
} finally {
responseGet.close();
} } finally {
httpclient.close();
}

  2,通过post方式提交表单。浏览器可将登录后的会话信息存储到本地,登陆之后的每次请求都会自动向服务器发送cookie信息,幸好的是httpclient亦可自动处理cookie信息。

        CloseableHttpClient httpclient = HttpClients.createDefault();

            // 以post方法发起登录请求
String urlString = "http://localhost/llogin.do";
HttpPost httpPost = new HttpPost(urlString);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("username", "admin"));
nvps.add(new BasicNameValuePair("password", "admin"));
// 添加post参数
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
CloseableHttpResponse response = httpclient.execute(httpPost); try {
// 状态302的话,重定向,则无法获取响应消息体
System.out.println(response.getStatusLine());
// 获得服务器响应的消息体(不包括http head)
HttpEntity entity = response.getEntity(); if (entity != null) {
// 获得响应字符集编码
ContentType contentType = ContentType.getOrDefault(entity);
Charset charset = contentType.getCharset();
InputStream is = entity.getContent();
// 将inputstream转化为reader,并使用缓冲读取,还可按行读取内容
BufferedReader br = new BufferedReader(
new InputStreamReader(is, charset));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
is.close();
} } finally {
response.close();
}

  3,重定向。httpclient默认可自动处理重定向请求,但是post方式需另外设置。

        LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy();
CloseableHttpClient httpclient = HttpClients.custom()
.setRedirectStrategy(redirectStrategy)
.build();
HttpClientContext context = HttpClientContext.create();
try {
// 以post方法执行登录请求
HttpPost httpPost = new HttpPost(urlString);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("username", "admin"));
nvps.add(new BasicNameValuePair("password", "admin"));
// 添加post参数
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
CloseableHttpResponse response = httpclient.execute(httpPost, context); try {
// 状态302的话,重定向,则无法获取响应消息体
System.out.println(response.getStatusLine());
// 获得服务器响应的消息体(不包括http head)
HttpEntity entity = response.getEntity(); //输出最终访问地址
HttpHost targetHost = context.getTargetHost();
System.out.println(targetHost);
List<URI> redirecLocations = context.getRedirectLocations();
URI location = URIUtils.resolve(httpPost.getURI(), targetHost, redirecLocations);
System.out.println("Final HTTP location: " + location.toASCIIString()); if (entity != null) {
// 获得响应字符集编码
ContentType contentType = ContentType.getOrDefault(entity);
Charset charset = contentType.getCharset();
InputStream is = entity.getContent();
// 将inputstream转化为reader,并使用缓冲读取,还可按行读取内容
BufferedReader br = new BufferedReader(
new InputStreamReader(is, charset));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
is.close();
} } finally {
response.close();
} } finally {
httpclient.close();
}

  4,利用httpclient,我们可以封装一个方法,只要传入httpclient对象和url地址,即可返回网页内容。

    public static String getHtml(HttpClient httpClient, String url)  {

        // HttpClient主要用来执行http方法
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
// 以get方法向服务端发起请求
HttpGet httpGet = new HttpGet(url);
// 获得服务器响应的所有信息
CloseableHttpResponse responseGet = httpclient.execute(httpGet); try {
// 获得服务器响应的消息体(不包括http head)
HttpEntity entity = responseGet.getEntity(); if (entity != null) {
// 获得响应字符集编码
ContentType contentType = ContentType.getOrDefault(entity);
Charset charset = contentType.getCharset();
InputStream is = entity.getContent();
//IOUtils是common-io提供的
String htmlString = IOUtils.toString(is); is.close();
return htmlString;
}
} finally {
responseGet.close();
} } catch (Exception e) {
e.printStackTrace();
} return null;
}

  另外,若访问的是图片,则可从输入流中将内容存储到byte数组中,如byte[] image = IOUtils.toByteArray(is),返回byte[]即可;若想下载保存到本地,可使用IOUtils的方法:IOUtils.copy(is, new FileOutputStream(filename))。

这里略提一下Apache-Commons-IO组件,它是对jdk中的io包进行拓展,让我们可以更方便处理输入输出流和对文件的处理。

最后,要想学习熟悉httpclient,最好就是查看其官方文档和它提供的范例,它的文档和范例都很不错,推荐阅读。

利用HttpClient4访问网页的更多相关文章

  1. Android网络:HTTP之利用HttpURLConnection访问网页、获取网络图片实例 (附源码)

    http://blog.csdn.net/yanzi1225627/article/details/22222735 如前文所示的TCP局域网传送东西,除了对传输层的TCP/UDP支持良好外,Andr ...

  2. 浅谈 php 采用curl 函数库获取网页 cookie 和 带着cookie去访问 网页的方法!!!!

    由于近段时间帮朋友开发一个能够查询正方教务系统的微信公众平台号.有所收获.这里总结下个人经验. 开讲前,先吐槽一下新浪云服务器,一个程序里的   同一个函数  在PC测试可以正常运行,在它那里就会挂的 ...

  3. Linux命令行访问网页

    找到个好资料,备份行: http://hi.baidu.com/oyvfhp/blog/item/3aa5ced5b40563d351da4bb0.html   CURL --- 命令行浏览器 这东西 ...

  4. 如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票

      一.前言看个图,了解下投票的过程.提交投票信息投票页 ――――――――>投票信息处理页反馈投票结果(请求页)<―――――――(响应页)一般情况下,填写投票信息,然后点提交按钮发送到响应 ...

  5. 利用 clipboardData 在网页中实现截屏粘贴的功能

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  6. 第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码

    Python要访问一个网页并读取网页内容非常简单,在利用<第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头>的方法构建了请求http报文的请求头情况下,使 ...

  7. nodejs利用ajax实现网页无刷新上传图片

    nodejs利用ajax实现网页无刷新上传图片 标签(空格分隔): nodejs 通常情况下上传图片是要通过提交form表单来实现的,但是这又不可避免的产生了网页转. 利用ajax技术和FormDat ...

  8. windows下不打开浏览器访问网页的方法

    我们打开电脑,大多时候都是打开浏览器在上网.这都是通过浏览器来实现的,然而windows下有没有办法不通过浏览器也可以像linux那样达到访问网页的目的呢?这当然少不了批处理或者VBScript.然而 ...

  9. 访问网页时提示的503错误信息在IIS中怎么设置

    访问网页时提示的503错误信息在IIS中怎么设置 503是一种常见的HTTP状态码,出现此提示信息的原因是由于临时的服务器维护或者过载,服务器当前无法处理请求则导致了访问网页时出现了503错误.那么当 ...

随机推荐

  1. CSS3学习笔记(2)—左右跳动的红心

    还在为无法表达内心澎湃的心情而着急吗?还在为制作跳动的心而烦恼吗?哈哈,今天我就把代码全部奉上,为你们追妹子添点贡献,下面来看最终的动态效果(事先说明一下:我用的截屏gif制作软件是绿色版的,所以gi ...

  2. linux命令行快捷键记录

    摘自: http://www.cnblogs.com/webzhangnan/p/3221410.html [移动光标] Ctrl+A 标移到行首.它在多数文本编辑器和 Mozilla 的 URL 字 ...

  3. Swing项目编译成exe,并且打包成安装文件(一)

    我们一般用java做Swing项目的时候一般都是只能在Myeclipse里面运行,那么怎么把我们的项目打包成exe可以直接双击运行呢? 初始工作:为了不让用户安装java环境,所以我们先新建一个文件夹 ...

  4. linux应用之apache服务的安装及配置(centos)

    CentOS Apache服务器安装与配置   一.安装Apache程序,一般有三种安装方式:1.直接网络安装:2.下载rpm包,上传至服务器进行安装:3.通过原代码编译安装: yum -y inst ...

  5. 关于 josnp ,解决跨域问题

    JSONP是服务器与客户端跨源通信的常用方法.最大特点就是简单适用,老式浏览器全部支持,服务器不用做任何改造[使用jsonp的时候jsonp: "callback",callbac ...

  6. CodeForces768B:Code For 1 (分治)

    Jon fought bravely to rescue the wildlings who were attacked by the white-walkers at Hardhome. On hi ...

  7. SSAS GUID 添加 行计数,非重复计数 等 遇到的莫名其妙的问题

    在基于某个GUID 进行非重复性计数时 需要对GUID 转换类型,如:CAST(ColumnName as varchar(36)) 可参考:http://stackoverflow.com/ques ...

  8. Python_XML的三种解析方法

    什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这 ...

  9. 02-安装JDK - Java快速入门

    jdk安装的版本

  10. Flex屏蔽并自定义鼠标右键菜单

    http://www.cnblogs.com/wuhenke/archive/2010/01/29/1659353.html Google Code上有一个RightClickManager的项目. ...