一、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. HDU2068 RPG的错排 —— 错排

    题目链接:https://vjudge.net/problem/HDU-2068 RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Lim ...

  2. WPF-初始屏幕(SplashScreen)

    本主题介绍如何将启动窗口(也称为“初始屏幕”)添加到 Windows Presentation Foundation (WPF) 应用程序. 添加现有图像作为初始屏幕 创建或查找要用于初始屏幕的图像. ...

  3. Android Developers - Training

    Recently I've been contemplating to create a new App with the true "Android Design",new An ...

  4. 「LuoguP1402」 酒店之王(最大流

    题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...

  5. 「LuoguP1341」 无序字母对(欧拉回路

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...

  6. ubuntu系统,关于源(source)的配置

    1. 现象:(出现的错误) 执行 sudo apt-get update, 报错:apt-get 404 Not Found Package Repository Errors 执行 sudo apt ...

  7. call,apply,bind与es6的数组扩展运算符...

    js中每一个Function对象都有一个apply个一个call方法: function.apply(thisObj,[argArray]); function.call(thisObj,arg1,a ...

  8. 自已封装Ajax方法

    function createXHR() { var request; if (typeof (XMLHttpRequest) == 'undefined') { request = new Acti ...

  9. AngularJS系统学习之Factory,Service, Provider(工厂,服务,供应者)

    本文转自:http://blog.csdn.net/zcl_love_wx/article/details/51404390 我看过敲过代码之后, 有了很深的理解, 这三个东西其实都是用来返回对象的. ...

  10. CodeForces Gym 100685J Just Another Disney Problem (STL,排序)

    题意:给定你大小未知的n个数,你允许有不超过一万次的询问,每次询问两个数,第i个数是否比第j个数小?然后后台会返回给你一个结果YES或者NO(即一行输入), 然后经过多次询问后,你需要给出一个正确的原 ...