博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HttpClient4.5中文教程】【第一章 :基础】1.1运行请求(二)
阅读量:5909 次
发布时间:2019-06-19

本文共 4253 字,大约阅读时间需要 14 分钟。

很多其它HttpClient4.5中文教程请查看

===========================================================================================================

1.1.4.HTTP实体(HTTP Entity)

HTTP报文可以携带与请求或对应相关联的内容实体。实体存在于某些请求、响应中,它门是可选的。

使用实体的请求被称为内含实体请求【译者:原文为entity enclosing requests。我把它翻译为 内含实体请求】

HTTP规范定义了两种内含实体请求。POST和PUT。而响应总是内含实体。

但有些响应不符合这一规则,比方,对HEAD方法的响应和状态为204 No Content, 304 Not Modified, 205 Reset Content的响应。

根据实体的内容来源,HttpClient区分出三种实体:
流式实体(streamed):内容来源于一个流。或者在执行中产生【译者:原文为generated on the fly】。特别的,这个类别包含从响应中接收到的实体。

流式实体不可反复。

自包括实体(self-contained):在内存中的内容或者通过独立的连接/其它实体获得的内容。自包括实体是可反复的。这类实体大部分是HTTP内含实体请求。
包装实体(wrapping):从另外一个实体中获取内容。

1.1.4.1 可反复实体

一个实体可以被反复,意味着它的内容可以被读取多次。它仅可能是自包括实体(像ByteArrayEntity或StringEntity)

1.1.4.2 使用HTTP实体

因为一个实体可以表现为二进制和字符内容,它支持二进制编码(为了支持后者。即字符内容)。

实体将会在一些情况下被创建:当运行一个含有内容的请求时或者当请求成功。响应体作为结果返回给client时。为了读取实体的内容。能够通过HttpEntity#getContent() 方法取出输入流。返回一个java.io.InputStream,或者提供一个输出流给HttpEntity#writeTo(OutputStream) 方法,它将会返回写入给定流的全部内容。

当实体内部含有信息时,使用HttpEntity#getContentType()和HttpEntity#getContentLength()方法将会读取一些主要的元数据,比方Content-Type和Content-Length这种首部(假设他们可用的话)。因为Content-Type首部可以包括文本MIME类型(像 text/plain 或text/html),它也包括了与MIME类型相相应的字符编码。HttpEntity#getContentEncoding()方法被用来读取这些字符编码。假设相应的首部不存在,则Content-Length的返回值为-1,Content-Type返回值为NULL。假设Content-Type是可用的,一个Header类的对象将会返回。

当我们构建一个具有可用信息的实体时,元数据将会被实体构建器提供。【译者:我理解的是。如以下样例中的长度,并没有声明,可是可用,是构建器生成的】

StringEntity myEntity = new StringEntity("important message",                          ContentType.create("text/plain", "UTF-8"));System.out.println(myEntity.getContentType());System.out.println(myEntity.getContentLength());System.out.println(EntityUtils.toString(myEntity));System.out.println(EntityUtils.toByteArray(myEntity).length);
输出:
Content-Type: text/plain; charset=utf-8
17
important message

17

1.1.5.确保释放低级别的资源

为了确保正确的释放系统资源,你必须关掉与实体与实体相关的的内容流。还必须关掉响应本身。
CloseableHttpClient httpclient = HttpClients.createDefault();HttpGet httpget = new HttpGet("http://localhost/");CloseableHttpResponse response = httpclient.execute(httpget);try {     HttpEntity entity = response.getEntity();     if (entity != null) {        InputStream instream = entity.getContent();        try {            // do something useful        } finally {            instream.close();        }   }} finally {     response.close();}
关闭内容流和关闭响应的不同点是:前者将会通过消费实体内容保持潜在的连接。而后者迅速的关闭并丢弃连接。
请注意,一旦实体被HttpEntity#writeTo(OutputStream)方法成功地写入时,也须要确保正确地释放系统资源。假设方法获得通过HttpEntity#getContent(),它也须要在一个finally子句中关闭流。

当使用实体时,你能够使用EntityUtils#consume(HttpEntity)方法来确保实体内容全然被消费而且使潜在的流关闭。

某些情况。整个响应内容的只一小部分须要被取出。会使消费其它剩余内容的性能代价和连接可重用性代价太高,这时能够通过关闭响应来终止内容流。

【译者:样例中能够看出,实体输入流只读取了两个字节,就关闭了响应,也就是按需读取,而不是读取所有响应】

CloseableHttpClient httpclient = HttpClients.createDefault();HttpGet httpget = new HttpGet("http://localhost/");CloseableHttpResponse response = httpclient.execute(httpget);try {HttpEntity entity = response.getEntity();if (entity != null) {        InputStream instream = entity.getContent();    int byteOne = instream.read();        int byteTwo = instream.read();    // Do not need the rest}} finally {    response.close();}

这样,连接将不会被重用,它分配的全部级别的资源将会被解除。

1.1.6.消费实体内容

为了消费实体内容,推荐的方式是使用HttpEntity#getContent()或者 HttpEntity#writeTo(OutputStream)方法。HttpClient也提供了一个EntityUtils类,它有几个静态方法更easy的从实体中读取内容或信息。

代替了直接读取java.io.InputStream,你能够通过这个类的方法取出所有内容体并放入一个String 中或者byte数组中。

但是,强烈不建议使用EntityUtils,除非响应实体来自于信任的HTTPserver而且知道它的长度。【译者:】

CloseableHttpClient httpclient = HttpClients.createDefault();HttpGet httpget = new HttpGet("http://localhost/");CloseableHttpResponse response = httpclient.execute(httpget);try {HttpEntity entity = response.getEntity();if (entity != null) {        long len = entity.getContentLength();        if (len != -1 && len < 2048) {             System.out.println(EntityUtils.toString(entity));    } else {        // Stream content out    }}} finally {    response.close();}

在某些情况下,多次读取实体内容是必要的。在这样的情况下,实体内容必须以一些方式缓冲,内存或者硬盘中。为了达到这个目的,最简单的方法是把原始的实体用BufferedHttpEntity类包装起来。这将会使原始实体的内容读入一个in-memory缓冲区。

全部方式的实体包装都是代表最原始的那个实体。

CloseableHttpResponse response = <...>HttpEntity entity = response.getEntity();if (entity != null) {    entity = new BufferedHttpEntity(entity);}

==================总结=====================

1.经过前面两节的学习,你已经掌握HttpClient4.5的基本使用方法了~赶快去试一下吧~

   【HttpClient4.5实训】一.GET请求訪问新浪网(非原文教程)

转载地址:http://awvpx.baihongyu.com/

你可能感兴趣的文章
极值问题(acms)
查看>>
SVN Hooks的介绍及使用
查看>>
JAVA核心编程教学
查看>>
apache 限制指定user_agent
查看>>
soap 的应用
查看>>
APP的广告模式
查看>>
margin:0 auto 与 text-align:center 的区别(转载)
查看>>
判断一个字符是否为数字的两种方法(C/C++)
查看>>
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleExcept问题解决方案
查看>>
600. Non-negative Integers without Consecutive Ones
查看>>
关于正则表达式的入门心得
查看>>
axios 拦截 , 页面跳转, token 验证(自己摸索了一天搞出来的)
查看>>
三星i917官方wp7.8刷机、越狱、防锁全过程
查看>>
区块链初始化与实现POW工作量证明
查看>>
对《微营销》与《大数据营销》的读后思考
查看>>
Python从菜鸟到高手(13):分片(Slicing)
查看>>
tinymce entities 配置
查看>>
编码导致 html和aspx 样式差异,变形
查看>>
C++的Json解析库:jsoncpp和boost .
查看>>
vs里怎么看当前项目.net版本?
查看>>