文档章节

第1个HttpClient 例子

诺岚
 诺岚
发布于 2017/08/29 10:05
字数 1729
阅读 23
收藏 0
点赞 0
评论 0

 学习HttpClient 的第一个例子,可以成功获取到网页内容

POM.xml

<dependencies>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.2</version>
    </dependency>
</dependencies>
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;



public class HelloWorld {
    public static void main(String[] args) throws Exception {
        //创建httpClient实例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        //创建httpget实例
        HttpGet httpGet = new HttpGet("http://www.qq.com/");
        CloseableHttpResponse response=null;

            //执行http get请求
            response=httpclient.execute(httpGet);
            //// 获取返回实体
        HttpEntity entity = response.getEntity();
        System.out.println("网页内容:"+ EntityUtils.toString(entity,"utf-8"));


        response.close();//response 关闭
        httpclient.close();//httpClient 关闭

    }
}

-----------------------------以下是官方文档说明

准备好

您需要做的第一件事是获取HttpClient及其 依赖项的副本。本教程是针对HttpClient 3.0 编写的。您还需要JDK 1.3或更高版本。

一旦您下载了HttpClient和依赖关系,您将需要将它们放在您的类路径上。对于HTTPS连接,JSSE还有一个可选的依赖关系; 这不是本教程所必需的。

概念

使用HttpClient的一般过程包括若干步骤:

  1. 创建一个实例HttpClient
  2. 创建一个方法的实例(在这种情况下为GetMethod)。要连接的URL被传递给方法构造函数。
  3. 告诉HttpClient执行该方法。
  4. 阅读回应。
  5. 释放连接。
  6. 处理响应。

我们将介绍如何执行以下每个步骤。请注意,无论服务器是否返回错误,我们都会执行整个过程。这很重要,因为HTTP 1.1允许多个请求通过简单地一个接一个地发送请求来使用相同的连接。显然,如果我们没有读取对第一个请求的整个响应,剩下的数据就会阻碍第二个响应。 HttpClient尝试处理这个但是为了避免问题,始终释放连接很重要。

在连接释放后,HttpClient将尽力确保连接可重用。

实例化HttpClient

无参数构造函数为HttpClient大多数情况提供了一套很好的默认值,这就是我们将要使用的。

//创建httpClient实例
  CloseableHttpClient httpclient = HttpClients.createDefault();

创建方法

HTTP规范定义的各种方法对应于实现HttpMethod接口的HttpClient中的各种类。这些类都在包中找到 org.apache.commons.httpclient.methods

我们将使用Get方法,这是一个简单的方法,只需要一个URL并获取URL指向的文档。

//创建httpget实例
HttpGet httpGet = new HttpGet("http://www.qq.com/");

执行方法

该方法的实际执行是通过调用 executeMethod客户端并传递方法来执行的。由于网络连接不可靠,因此我们还需要处理发生的任何错误。

有两种类型的异常,可以通过executeMethod被抛出,HttpExceptionIOException

另一个有用的信息是服务器返回的状态码。该代码由executeMethod作为int返回,可用于确定请求是否成功,有时可以指示客户端需要进一步的操作,例如提供验证凭据。

HttpException

HttpException表示逻辑错误,并且在请求无法发送或由于HTTP规范的致命违反而无法处理响应时抛出。通常这种异常无法从中恢复。有关协议异常的详细讨论,请参考 HttpClient异常处理指南。请注意,HttpException实际上扩展了IOException,因此如果应用程序不区分协议和传输错误,您可以忽略它并捕获IOException。

IOException异常

一个简单的IOException(它不是HttpException的子类)表示一个传输错误,并且当出现可能是一次性I / O问题的错误时抛出。通常,请求在第二次尝试中有很好的成功机会,所以默认情况下,HttpClient将尝试自动恢复请求。有关传输异常的详细讨论,请参考 HttpClient异常处理指南

方法恢复

默认情况下,HttpClient将自动尝试从非致命错误中恢复,即抛出一个普通的IOException异常。HttpClient将重试该方法三次,前提是该请求从未完全传输到目标服务器。有关HTTP方法恢复的详细讨论,请参考HttpClient异常处理指南

// set per default
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
  new DefaultHttpMethodRetryHandler());

默认恢复过程可以用自定义恢复过程替换。可以增加自动重试次数。即使请求可能已经被服务器处理并且在接收到响应时发生了I / O异常,也可以指示HttpClient重试该方法。启用自动重试时请小心。仅当方法知道是幂等时才使用它,也就是说,已知可以安全地重试多次,而不会导致数据损坏或数据不一致。

经验法则是GET方法通常是安全的,除非另有说明,除非另有说明,实体封闭方法(如POST和PUT)通常是不安全的。

DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler(10, true);
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);

阅读回应

无论服务器返回的状态如何,响应体总是被读取至关重要。有三种方法可以做到这一点:

  • Call method.getResponseBody(). 这将返回包含响应正文中的数据的字节数组。
  • Call method.getResponseBodyAsString().。这将返回一个包含响应体的String。请注意,尽管使用默认的编码方式,从字节到字符串的转换已经完成,因此该方法可能无法在所有平台上移植。
  • Call method.getResponseBodyAsStream() 并读取流的所有内容,然后调用stream.close()。如果可以接收大量数据,那么这种方法是最好的,因为它可以缓冲到文件中或在读取时被处理。确保始终读取整个数据,并在流上呼叫close。

对于本教程,我们将使用getResponseBody()简单。

byte[] responseBody = method.getResponseBody();

释放连接

这是保持事态发展的关键一步。我们必须告诉 HttpClient我们完成了连接,现在可以重用。没有这样做,HttpClient将无限期地等待连接释放,以便可以重用。

method.releaseConnection();

处理Repsonse

我们现在已经完成了与HttpClient的交互,可以专注于做我们需要做的数据。在我们的例子中,我们将它打印出来到控制台。

值得注意的是,如果您将响应作为流检索并在读取时进行处理,则此步骤实际上与读取连接相结合,并且在完成处理所有数据后,您将关闭输入流和释放连接。

注意:我们应该注意这里的字符编码,而不是仅使用系统默认值。

System.out.println(new String(responseBody));

最终源代码

当我们把所有这一切加上一点胶水代码,我们得到下面的程序。

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;



public class HelloWorld {
    public static void main(String[] args) throws Exception {
        //创建httpClient实例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        //创建httpget实例
        HttpGet httpGet = new HttpGet("http://www.qq.com/");
        CloseableHttpResponse response=null;

            //执行http get请求
            response=httpclient.execute(httpGet);
            //// 获取返回实体
        HttpEntity entity = response.getEntity();
        System.out.println("网页内容:"+ EntityUtils.toString(entity,"utf-8"));


        response.close();//response 关闭
        httpclient.close();//httpClient 关闭

    }
}

 

© 著作权归作者所有

共有 人打赏支持
诺岚
粉丝 0
博文 87
码字总数 143206
作品 0
广州
程序员
HttpClient4.x:Get和Post提交数据

HttpClient是一款用Java写的非常好用的基于Http协议的客户端编程工具包。具体举例来讲,用它可以模拟form表单提交数据动作,可以模拟访问网页动作及得到网页源码内容等等,这两点或许是我们在...

liangtee
2012/12/02
0
0
HTTP协议和HttpClient的入门

HTTP协议的发展史没有了解,是给予请求与响应模式的、无连接、无状态的应用层的协议。 HTTP协议 HTTP协议的URL HTTP URL(URL是一种特殊类型的URI,包含了勇于查找某个资源的足够的信息)的格式...

凹凸口天
2013/07/15
0
0
apache HttpClient学习系列--1

这两天开始准备做一个自己的网络爬虫,所以就各种找资料,找到了一个资料,讲的挺好的,用的就是HttpClient来写的,就在apache上下了jar包,准备自己编写,但是硬是找不到对应的类。上了apa...

无情小白龙
2014/03/15
0
0
研究支付时碰到了 httpclient 围观

HttpClient最重要的功能是执行HTTP方法。一个HTTP方法的执行包含一个或多个HTTP请求/HTTP响应交换,通常由HttpClient的内部来处理。而期望用户提供一个要执行的请求对象,而HttpClient期望传...

JAVA码猿
2017/11/07
0
0
httpClient4.2官方文档研究

前言 超文本传输协议(HTTP)也许是最常用的在互联网上使用的协议。 Web服务,支持网络设备和网络计算的增长继续扩大用户驱动的Web浏览器的HTTP协议之外的作用,同时增加了一些应用程序需要H...

harries
2015/08/24
0
0
【J2EE系列】HttpClient 学习整理 [转]

HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的实现,发现这个开源项目之后就有点眉目了,令人头痛的cookie问题还是有办法解决滴。在网上整理了一些东西,写得很好,寄放...

磊神Ray
2012/01/12
0
0
HttpClient 4.0 保持登录session 访问网页

ession的保持是通过cookie来维持的,所以如果用户有勾选X天内免登录,这个session 就X天内一直有效,就是通过这个cookie来维护。如果没选X天内免登录,基本上就本次才能保持session,下次打开...

Jonson
2013/07/18
0
1
Android 浅谈HttpClient工具类

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpClient想象成一个浏览器,通过它的...

Jonson
2013/07/25
0
3
HttpClient 学习整理

HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的实现,发现这个开源项目之后就有点眉目了,令人头痛的cookie问题还是有办法解决滴。在网上整理了一些东西,写得很好,寄放...

晨曦之光
2012/02/24
0
0
通过JAVA程序来获取某个页面的信息 HttpClient

今天碰到一个问题,就是跨域调取数据的问题.....应该算是跨域吧,看到程序时用httpClient写的,晚上回来看了一下,非常好,看到一篇好文章,转过来 一般的情况下我们都是使用IE或者Navigator...

枫爱若雪
2012/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、登录流程图 二、小程序客户端 doLogin:function(callback = () =>{}){let ...

公众号_好好学java
37分钟前
0
1
流利阅读笔记28-20180717待学习

“我不干了!” 英国脱欧大臣递交辞呈 雪梨 2018-07-17 1.今日导读 7 月 6 日,英国政府高官齐聚英国首相的官方乡间别墅——契克斯庄园,讨论起草了一份关于英国政府脱欧立场的白皮书。可是没...

aibinxiao
今天
7
0
OSChina 周二乱弹 —— 理解超算排名这个事,竟然超出了很多人的智商

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @-冰冰棒- :分享Ed Sheeran/Beyoncé的单曲《Perfect Duet (with Beyoncé)》 《Perfect Duet (with Beyoncé)》- Ed Sheeran/Beyoncé 手机...

小小编辑
今天
180
7
Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
今天
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
1
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部