httpclient4.5 入门教程 1.1执行请求<二>

Httpclient3.1指定tlsv1.2协议访问https 前言 最近因公司某个服务器应用升级以及互联网安全要求,近期将禁用对TLSv1.0、TLSv1.1的访问支持,要求所有访问该服务的客户端项目升级到TLSv1.2,否则到期TLSv1.2生效后,将影响客户端的正常访问,于是安排工作着手对部份老项目进行升级改造。 TLS协议说明 百度百科的描述 安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。 该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。 传输层安全性协 阅读详情
本文转载自http://blog.youkuaiyun.com/u011179993/article/details/47147909

更多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实体

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

实体将会在一些情况下被创建:当执行一个含有内容的请求时或者当请求成功,响应体作为结果返回给客户端时。为了读取实体的内容,可以通过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类的对象将会返回。


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

  1. StringEntity myEntity = new StringEntity(“important message”,  
  2.                           ContentType.create(”text/plain”, “UTF-8”));  
  3. System.out.println(myEntity.getContentType());  
  4. System.out.println(myEntity.getContentLength());  
  5. System.out.println(EntityUtils.toString(myEntity));  
  6. System.out.println(EntityUtils.toByteArray(myEntity).length);  
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.确保释放低级别的资源

为了确保正确的释放系统资源,你必须关掉与实体与实体相关的的内容流,还必须关掉响应本身。
  1. CloseableHttpClient httpclient = HttpClients.createDefault();  
  2. HttpGet httpget = new HttpGet(“http://localhost/”);  
  3. CloseableHttpResponse response = httpclient.execute(httpget);  
  4. try {  
  5.      HttpEntity entity = response.getEntity();  
  6.      if (entity != null) {  
  7.         InputStream instream = entity.getContent();  
  8.         try {  
  9.             // do something useful  
  10.         } finally {  
  11.             instream.close();  
  12.         }  
  13.    }  
  14. } finally {  
  15.      response.close();  
  16. }  
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)方法来确保实体内容完全被消费并且使潜在的流关闭。
某些情况,整个响应内容的仅仅一小部分需要被取出,会使消费其他剩余内容的性能代价和连接可重用性代价太高,这时可以通过关闭响应来终止内容流。【译者:例子中可以看出,实体输入流仅仅读取了两个字节,就关闭了响应,也就是按需读取,而不是读取全部响应】

  1. CloseableHttpClient httpclient = HttpClients.createDefault();  
  2. HttpGet httpget = new HttpGet(“http://localhost/”);  
  3. CloseableHttpResponse response = httpclient.execute(httpget);  
  4. try {  
  5. HttpEntity entity = response.getEntity();  
  6. if (entity != null) {  
  7.         InputStream instream = entity.getContent();  
  8.     int byteOne = instream.read();  
  9.         int byteTwo = instream.read();  
  10.     // Do not need the rest  
  11. }  
  12. } finally {  
  13.     response.close();  
  14. }  
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类,它有几个静态方法更容易的从实体中读取内容或信息。取代了直接读取java.io.InputStream,你可以通过这个类的方法取出全部内容体并放入一个String 中或者byte数组中。可是,强烈不建议使用EntityUtils,除非响应实体来自于信任的HTTP服务器并且知道它的长度。【译者:】
  1. CloseableHttpClient httpclient = HttpClients.createDefault();  
  2. HttpGet httpget = new HttpGet(“http://localhost/”);  
  3. CloseableHttpResponse response = httpclient.execute(httpget);  
  4. try {  
  5. HttpEntity entity = response.getEntity();  
  6. if (entity != null) {  
  7.         long len = entity.getContentLength();  
  8.         if (len != -1 && len < 2048) {  
  9.              System.out.println(EntityUtils.toString(entity));  
  10.     } else {  
  11.         // Stream content out  
  12.     }  
  13. }  
  14. } finally {  
  15.     response.close();  
  16. }  
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缓冲区。所有方式的实体包装都是代表最原始的那个实体。

  1. CloseableHttpResponse response = <…>  
  2. HttpEntity entity = response.getEntity();  
  3. if (entity != null) {  
  4.     entity = new BufferedHttpEntity(entity);  
  5. }  
CloseableHttpResponse response = <...>
HttpEntity entity = response.getEntity();
if (entity != null) {
    entity = new BufferedHttpEntity(entity);
}

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

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

   【HttpClient4.5实训】一.GET请求访问新浪网(非原文教程)点击打开链接

Httpclient4.5详解之源码解析和使用一: 关键执行流程源码解读 前言 作为一个java后端开发,调用http协议的请求一直使用的httpclient,但是对他内部原理却一概不知,由于它使用了连接池来解决连接资源消耗所带来的问题,同时我们在使用时他也隐匿了连接池操作的很多细节,所以若是使用不当势必会带来很多隐藏的坑(诸如CLOSE_WAIT过多造成服务假死之类)所以最近有时间看了他内部源码,特此记录下来。 httpclient当前版本总览: httpc... 阅读详情

相关推荐

Apache HttpClient4使用教程

基于HttpClient 4.5.2 执行GET请求 CloseableHttpClient httpClient = HttpClients.custom() .build(); CloseableHttpResponse response = httpClient.execute(new HttpGet(&quot;https://www.baidu.com&quot;)); ...

vwycm的博客 5419

【HttpClient4.5中文教程】【第一章 :基础】1.1执行请求(二)

原文:http://blog.csdn.net/u011179993/article/details/47147909 更多HttpClient4.5中文教程请查看:点击打开链接 ================================================================================================

Ryan Z 的技术日志 610

Java使用HttpClient5实现发送HTTP请求

HttpClient5 是 Apache HttpComponents 项目中的一个重要组件,它是一个功能齐全且高度可定制的 HTTP 客户端库,专门用于发送 HTTP 请求、处理 HTTP 响应并支持各种 HTTP 协议特性。内置的连接池机制能提高并发处理性能,减少资源消耗。内置 Cookie 管理功能,能够自动处理服务端返回的 Cookie 并在后续请求中使用,模拟浏览器行为。HttpClient5 的设计高度模块化,用户可以根据需要对连接管理、重定向策略、请求重试策略、代理设置等进行灵活定制。

pan_junbiao的博客 2043

httpclient 4.5.1---基础

转载请声明,谢谢!

wendrewshay 662

HTTPClient 4.5:必备Jar包及源码解析

在当今的网络时代,HTTPClient作为一款广泛使用的网络通信客户端库,对于Web开发者而言可谓是不可或缺的工具。本章节将简要介绍HTTPClient的基础知识及其在应用开发中的重要性。HTTPClient是一个开源的Java HTTP客户端库,它提供了访问Web服务器的简易方式。通过它,开发者可以构建HTTP请求、发送请求并接收响应,这些操作都封装在易于理解和使用的API中。超文本传输协议(HTTP)是互联网上应用最为广泛的一种网络协议。

weixin_32445049的博客 929

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 328

HttpClient学习

用HttpClient对Https请求处理的两种方式设置信任自签名证书绕过证书验证 记录一下HttpClient抓https网站碰到SSLHandshakeException,虽然最后也没解决,但也要记一下常用两种方式备用。 javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake ...

weixin_44713424的博客 585

新手必看:如何用Python模拟电动助力转向系统(EPS)的传感器信号处理

本文详细介绍了如何使用Python模拟电动助力转向系统(EPS)的传感器信号处理流程,包括转向力矩、转向角度和车速信号的生成与滤波处理。通过实战代码示例,帮助开发者理解ECU如何计算助力扭矩,并提供了可视化分析和性能优化建议,适合汽车电子系统开发新手学习。

weixin_28327051的博客 356

httpClient4.5使用

1.基本使用 public class TestHttpClient { public static void main(String[] args) throws IOException { String url = "http://www.youku.com"; CloseableHttpClient client = HttpClients.cu...

woaiqianzhige的博客 3746

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1941

Android ------ 开源的Modnet算法实现抠图和更换背景

Portrait Matting (sight-x.cn) 飞桨PaddlePaddle-源于产业实践的开源深度学习平台 GitHub - PaddlePaddle/PaddleSeg at develop

切切歆语的博客 1万+

【HttpClient】HttpClient4.5基础教程

一、前言 1、说明 HttpClient是一个目前最常用的用于模拟客户端发送http请求的工具,可用于接口自动化测试或者爬虫或者在项目中加入获取其他网站数据等; 支持目前所有的请求方式,如put,post,get,delete等; 2、maven依赖添加 maven依赖如下: &amp;amp;amp;lt;dependency&amp;amp;amp;gt; &amp;amp;amp;lt;groupId&amp;amp;amp;gt;org.apache.ht

df0128的专栏 1万+

Arxml文件可视化:当汽车软件架构遇见交互式设计工具

本文探讨了Arxml文件在汽车电子系统开发中的可视化技术,结合AUTOSAR架构标准,介绍了如何利用现代Web技术构建交互式设计工具。通过三维组件关系图、动态数据流展示和版本对比等功能,显著提升开发效率和架构评审质量,适用于MBD和ASPICE开发流程。

weixin_29050271的博客 429

通过httpClient4.5.3发送POST请求,并添加请求头参数以及json格式请求参数

1、使用如下jar包或者添加maven依赖 &lt;dependency&gt; &lt;groupId&gt;org.apache.httpcomponents&lt;/groupId&gt; &lt;artifactId&gt;httpclient&lt;/artifactId&gt; &lt;version&gt;4.5.3&lt;/version&gt; &

lichuangcsdn的博客 2万+

opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用opencode的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

实测可复现|2026 Cloudflare盾v4.0反反爬全实战:从JS/WASM逆向到JA3指纹伪装,手把手突破拦截(附完整逆向代码+避坑手册)

本文以2026年Cloudflare盾v4.0(集成Shield Synapse v2.0)为核心,全程以实战复盘为视角,拆解了从JS/WASM混合逆向、全维度指纹伪装(JA3+浏览器指纹)、人类行为模拟,到代理池搭建的全流程,整合了完整可复现的代码,所有步骤和踩坑点均为实测所得,无任何AI套话,新手也能跟着复现,最终实现爬取成功率从12%提升至95%+。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1690

Java HttpClient爬虫请求

**本项目采用spring-boot构建, maven工程 添加依赖 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> &l

Codeooo 博客 1万+

使用Qt和MX Component插件实现与菱PLC的通信

在本文中,我们介绍了如何使用Qt和MX Component插件实现与菱PLC的通信。我们首先安装和配置了MX Component插件,并在Qt项目中初始化和使用MX Component来连接、读取和写入PLC的数据。安装完成后,您需要在Qt项目中配置MX Component的路径,以便Qt可以找到所需的库文件。在本文中,我们将探讨如何使用Qt和MX Component插件来实现与菱PLC的通信。在主函数中,我们将初始化MX Component,并创建一个与PLC通信的示例。在上面的代码中,我们使用了。

TlScratch的博客 996

http请求 commons-httpclient(3.1)与httpclient(4.5.13) hutool(5.7.12)

一、commons-httpclient(3.1)(已经不在维护了) <!--commons-httpclient(已经不在维护了)--> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </d

tanzongbiao的专栏 4202

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

通过HttpClient4.5.3发送http get请求

1、添加jar或者maven依赖或者添加maven依赖 &lt;dependency&gt; &lt;groupId&gt;org.apache.httpcomponents&lt;/groupId&gt; &lt;artifactId&gt;httpclient&lt;/artifactId&gt; &lt;version&gt;4.5.3&lt;/version&gt;

lichuangcsdn的博客 1989

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

http请求封装JSONObject(基于httpclient4.5.10)

http请求封装JSONObject参数(基于httpclient4.5.10)导入Apache POI Maven jar包编写工具类 导入Apache POI Maven jar包 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <!-- SpringBoot 整...

Jian 1095

【HttpClient4.5中文教程】三.HttpClient执行基本请求

更多HttpClient4.5中文教程请查看:点击打开链接==================================HttpClient最基本的功能是执行HTTP方法,一次 HTTP 方法的执行包含一个或多个 HTTP 请求/响应的交互,通常由 HttpClient的内部来处理。使用者需要提供一个Request对象来执行HTTP请求,HttpClient就会把请求传送给目标服务器并返回一

要啥自行车 1万+

httpclient4.5.3 使用

我这里是使用maven来构建项目,用普通工程的请下载相关的包后加入buildpath 。 新建一个maven工程,这里我只是简单的写了两种请求 这里选择勾选建立一个简单工程 红色的地方可以根据需求选择,点击完成。 org.apache.httpcomponents httpclient 4.5.3 log4j

u012410349的博客 7675

基于 HttpClient 4.5 的 HttpClientUtils

欢迎关注微信公众号:PM实验室 我编写工具类所参考的文档 pache HttpClient: http://hc.apache.org/httpcomponents-client-ga/index.html 中文翻译教程: https://www.yiibai.com/apache_httpclient stackoverflow 关于SSL的讨论: https://stackoverfl...

野指针er 1525

Apache Httpclient4.5学习笔记

很早之前写过一个java爬虫,用来抓某网站妹子图片的,用到了httpclient包,但是没有认真理解方法,只是为了实现功能而拼凑了一个东西出来,当然也还为了好玩。 现在不一样了,已经决定了不考研,而又处于大三这个开始有找工作的压力的情况下,自然要开始学习磨炼自己的技术。再加上学习安卓网络编程正好用到了httpclient包,于是就下载了官方手册仔细的学了一学,现在在这里写下来我对第一部分(Pos

ztgreenleaves的博客 1883

HttpClient4.5 基础教程 执行请求<三>

更多HttpClient4.5中文教程请查看:点击打开链接 ===============================================1.1.7.生产实体内容 HttpClient提供了几个类,用来通过HTTP连接高效地传输内容。这些类的实例均与内含实体请求有关,比如POST和PUT,它们能够把实体内容封装进友好的HTTP请求中。对于基本的数据容器String, byte arr

光与热的博客 1024
上一篇: httpclient4.5 入门教程 1.1执行请求
下一篇: HttpClient4.5 get访问实例
光与热
博客等级 码龄11年 55粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值