HttpClient4.5详解

httpclient4.5 的 httpclient对象是可以作为单例复用的吗? Apache HttpClient 4.5 的 `HttpClient` 对象可以作为单例复用,且这是官方推荐的最佳实践 阅读详情

1.HttpClient简介


HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 (GA)


2.HttpClient特性


1. 基于标准、纯净的java语言。

2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3. 支持HTTPS协议。

4. 通过Http代理建立透明的连接。

5. 利用CONNECT方法通过Http代理建立隧道的https连接。

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

7. 插件式的自定义认证方案。

8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

10. 自动处理Set-Cookie中的Cookie。

11. 插件式的自定义Cookie策略。

12. Request的输出流可以避免流中内容直接缓冲到socket服务器。

13. Response的输入流可以有效的从socket服务器直接读取相应内容。

14. 在http1.0和http1.1中利用KeepAlive保持持久连接。

15. 直接获取服务器发送的response code和 headers。

16. 设置连接超时的能力。

17. 实验性的支持http1.1 response caching。

18. 源代码基于Apache License 可免费获取。


3.HttpClient使用方法


使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。


1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接



4.HttpClient实例


4.1使用环境(maven配置)





4.2实例应用


4.2.1   利用post方法模拟用户登录请求


public void post(){
		
		//创建httppost
		HttpPost post = new HttpPost("http://localhost:8080/hotel/admin/checkLogin.action");
		
		//创建参数队列
		List<NameValuePair> list = new ArrayList<NameValuePair>();
		
		//存放post请求的参数
		list.add(new BasicNameValuePair("username", "admin"));
		list.add(new BasicNameValuePair("password", "123456"));	
		UrlEncodedFormEntity entity;
		
		try {
			entity = new UrlEncodedFormEntity(list,"UTF-8");
			// 将请求体内容加入请求中
			post.setEntity(entity);
			System.out.println(post.getURI());
			HttpResponse response = httpClient.execute(post);
			HttpEntity et = response.getEntity();
			if(et != null){
				System.out.println(EntityUtils.toString(et));
			}
		} catch (UnsupportedEncodingException e) {
			
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}

4.2.2   利用post方法模拟用户添加,提交表单


public void postData(){
		
		//创建post
		HttpPost post = new HttpPost("http://localhost:8080/hotel/reserve/addreserve.action");
		
		//创建参数队列
		List<NameValuePair> list = new ArrayList<NameValuePair>();
		
		//存放post请求的参数
		list.add(new BasicNameValuePair("typeId", "2"));
		list.add(new BasicNameValuePair("roomName", "STD007"));	
		list.add(new BasicNameValuePair("roomNumber", "207"));	
		list.add(new BasicNameValuePair("recordNumber", "H-16081808182400008"));	
		list.add(new BasicNameValuePair("arriveDate", "2016-08-25"));	
		list.add(new BasicNameValuePair("leaveDate", "2016-08-25"));	

		try {
			
			UrlEncodedFormEntity entity;
			
			entity=new UrlEncodedFormEntity(list,"utf-8");
						
			post.setEntity(entity);
			
			HttpResponse response = httpClient.execute(post);
			
			System.out.println(response.getEntity());
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

4.2.3   利用get方法获取网页内数据


public void get(){
	        
        // 创建httpget.    
        HttpGet httpget = new HttpGet("http://localhost:8080/hotel/reserve/reserveList.action");  
        
        System.out.println("executing request " + httpget.getURI());  
        
        // 执行get请求.    
        HttpResponse response = null;
        
		try {
			response = httpClient.execute(httpget);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}  
		try {
        	 // 获取响应实体    
			
            HttpEntity entity = response.getEntity();  
            System.out.println("--------------------------------------");  
            
            // 打印响应状态    
            System.out.println(response.getStatusLine());  
            System.out.println("--------------------------------------");
            
            if (entity != null) {  
               
                // 打印响应内容    
			System.out.println("Response content: " + EntityUtils.toString(entity,"utf-8"));
            }
		} catch (org.apache.http.ParseException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}               

	}

4.2.4    利用get方法获取网页内数据进行页面静态化


public boolean test(String url,String htmlPage){
		
		//创建默认的httpClient实例
		CloseableHttpClient httpClient=HttpClients.createDefault();
		
		// 创建httpget.    
		HttpGet get = new HttpGet(url);
		
		try {
			//执行get请求
			CloseableHttpResponse response = httpClient.execute(get);
			
			//获取响应实体    
			HttpEntity entity = response.getEntity();
						
			//定义BufferedReader输入流来读取URL的响应 
			BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
			
			String pageContent="";
			
			//逐行读取数据
			while(true){
				String line = br.readLine();
				if(line == null){
					break;
				}else{
					pageContent+=line;
					pageContent+="\n";
				}
			}
			
			//创建字符输出流
			FileWriter writer = new FileWriter(htmlPage);
			
			PrintWriter fout = new PrintWriter(writer);
			
			fout.print(pageContent);
			fout.close();
		} catch (IOException e) {

		    System.out.println("IOException");
	            return false;
		}
		
		return true;
	}
	public static void main(String[] args) {
		Demo demo = new Demo();
		demo.test("http://localhost:8080/first/Power/test.action", "D:/a.html");
		System.out.println("已生成静态页面");
	}


5.HttpClient常见问题


5.1字符编码


某目标页的编码可能出现在两个地方,第一个地方是服务器返回的http头中,另外一个地方是得到的html/xml页面中。

对于像xml或者html这样的文件,允许作者在页面中直接指定编码类型。比如在html中会有<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>这样的标签;或者在xml中会有<?xml version="1.0" encoding="gb2312"?>这样的标签,在这些情况下,可能与http头中返回的编码信息冲突,需要用户自己判断到底那种编码类型应该是真正的编码。

5.2自动转向


根据RFC2616中对自动转向的定义,主要有两种:301和302。301表示永久的移走(Moved Permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。302表示暂时的转向,比如在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。


5.3处理HTTPS协议


HttpClient提供了对SSL的支持,在使用SSL之前必须安装JSSE。在Sun提供的1.4以后的版本中,JSSE已经集成到JDK中,如果你使用的是JDK1.4以前的版本则必须安装JSSE。JSSE不同的厂家有不同的实现。有两种方法可以打开https连接,第一种就是得到服务器颁发的证书,然后导入到本地的keystore中;另外一种办法就是通过扩展HttpClient的类来实现自动接受证书。


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

相关推荐

从HttpClient 4.x升级到5.x:实战避坑指南与API重构详解

HTTP客户端是网络编程中的基础组件,负责在应用间进行数据通信。其核心原理是通过封装TCP连接、请求构建与响应解析,实现高效可靠的数据传输。在Java生态中,Apache HttpClient因其稳定性和丰富的功能被广泛使用。随着技术演进,新版HttpClient 5在架构上进行了重大重构,旨在提升高并发下的吞吐量、优化资源管理,并提供更现代的Fluent API。这些改进对于构建高性能微服务、处理大量外部API调用等场景具有重要价值。本次升级实践聚焦于依赖管理、连接池配置和请求执行模型等关键模块,深入分析

weixin_30628801的博客 484

HttpClient4.5 入门

引言 本文主要记录如何初始化HttpClient4.5.x和入门使用. 参考官方文档 http://hc.apache.org/httpcomponents-client-4.5.x/current/tutorial/html/ 1. 构建HttpClient 1.1 构建前准备 在构建之前, 先大致了解一下HttpClient类 HttpClient子类 DecompressingHttpClient: HttpClient装饰器类, 支持解压逻辑. AutoRetryHttpClient: Http

更新博客 906

Httpclient4.5详解之源码解析和使用二: 连接池内连接的创建 借出 归还

Httpclient4.5详解之源码解析和使用一: 关键执行流程源码解读 承接上文,本文我们查看httpcommons连接池的源码来分析一下连接池将连接缓存起来然后借出的归还的,其中建立的socket连接是如何关闭的,现在我们就通过源码来一看究竟。 创建和借出 上文源码分析流程提到,具体流程会执行到InternalHttpClient#doExecute和execChain#execu...

派大星的博客 2502

【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万+

Httpclient4.5详解之源码解析和使用三: KeepAliveStrategy长连接还是短连接的判断

Httpclient4.5详解之源码解析和使用二: 连接池内连接的创建 借出 归还 接上篇文章我们分析了连接池内连接的创建 借出和归还,在归还那节中我们提到他是根据连接是长连接还是短连接来判断是关闭连接还是放回连接池保持连接,那么什么情况下为长连接,什么情况下又是短连接 MainClientExec#execute中获取到HttpResponse之后还有一个ConnectionReuseStr...

派大星的博客 4547

Httpclient4.5详解之源码解析和使用四: 连接池内连接的打开和socket绑定

在前文已经说到在MainClientExec#execute中充连接池中获取连接,那么拿到连接之后如何把socket绑定到这个连接对象中的呢。 还是在MainClientExec#execute中获取连接下面还有这么一段代码 if (!managedConn.isOpen()) { //连接是否打开 其实就是判断连接对象中的socket连接是否为空 ...

派大星的博客 1657

java httpclient4.5_httpclient4.5使用详解 httpclient 4.5 post传递json参数

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Map;import java.ut...

weixin_34963576的博客 738

Java实战:基于HttpClient 4.5.3构建高效HTTP客户端,详解GET与POST请求封装

本文详细介绍了如何使用Java的HttpClient 4.5.3构建高效的HTTP客户端,重点讲解了GET与POST请求的封装方法。通过连接池管理、超时配置和异常处理等技巧,帮助开发者提升HTTP通信的稳定性和性能,适用于电商、支付接口等实际项目场景。

weixin_42525582的博客 392

java httpclient4.5_Apache HttpClient 4.5.3 使用详解

目录环境准备二进制 Jar 包1、本文的 HttpClient 是指 Apache 官网 HttpComponents 项目下的子项目HttpClient 。2、如果项目使用手动导入 Jar 包的方式,则可以从官网下载,地址:http://hc.apache.org/downloads.cgi3、如果只是使用 HttpClient 做单纯的 get、post 等操作,则需导入下面红色框的几个包即可...

weixin_36439236的博客 1734

告别Apache HttpClient4!SpringCloud OpenFeign4.0迁移必看指南(含HC5配置模板)

本文是SpringCloud OpenFeign 4.0迁移至HttpClient5的实战指南。针对Apache HttpClient4被弃用的核心变更,详细解析了依赖替换、连接池配置、TLS协议兼容性等关键步骤,并提供了经过验证的生产级HC5配置模板,帮助开发者平稳完成迁移,规避常见陷阱。

delta的博客 584

SpringBoot3与OpenFeign 4.0升级实战:从依赖冲突到HttpClient5迁移

本文详细记录了从SpringBoot 2.x升级至SpringBoot 3.x并同步迁移OpenFeign至4.0版本的实战经验。核心在于解决因OpenFeign 4.0移除默认HttpClient 4支持而导致的依赖冲突与启动异常,重点阐述了如何正确迁移至Apache HttpClient 5,并提供了依赖管理、TLS协议兼容性配置及常见依赖冲突的排查与解决方案。

weixin_29216957的博客 298

HttpClient 4.5 Best Practice

最近在封装http请求相关的library,希望接口的行为和实现分离,这样底层library再切换不同http请求实现 例如:Apache HttpClient、OkHttp、AsyncHttpClient 等不影响上层调用行为。介绍HttpClient 4.5 Tutorial主要分为:基础(Fundamentals)、连接管理(Connection management)、http状态管理(HT

Ricky 3496

告别Apache HttpClient 4:SpringCloud OpenFeign 4.0强制升级HC5全指南

本文详细解析了Spring Cloud OpenFeign 4.0强制从Apache HttpClient 4迁移至Apache HttpClient 5(HC5)的技术背景与实战指南。文章深入探讨了升级的核心驱动力,并提供了从依赖管理、连接池配置到解决TLS协议兼容性等关键问题的完整迁移步骤,帮助开发者顺利完成Spring Boot 3.x项目的升级。

weixin_29291573的博客 451

告别ApacheHttpClient4:SpringBoot3+OpenFeign4必须知道的5个兼容性要点

本文深入解析SpringBoot3与OpenFeign4升级过程中Apache HttpClient4的兼容性问题,提供5个关键解决方案。从错误分析到官方变更解读,再到feign-hc5配置、TLS兼容性处理及性能调优,帮助开发者顺利完成技术迁移,提升微服务架构的稳定性和性能。

weixin_33734785的博客 373

org.apache.http.params 是 Apache HttpClient 库中的一个包,它包含与 HTTP 参数相关的接口和类

尽管在 HttpClient 4.3 及以后的版本中,HttpParams 接口和相关工具类(如 HttpConnectionParams、HttpClientParams、HttpProtocolParams)被弃用,并被推荐使用 RequestConfig 类进行配置,但 org.apache.http.params 包中的一些接口和类可能仍然在某些场景中或旧版本的 HttpClient 中被使用。在 HttpClient 的早期版本中,这些接口和类被用于配置 HTTP 请求和连接的各种参数。

[Blog][Domain] programb.blog.youkuaiyun.com 1256

httpclient4.5 jar包

httpclient4.5 所需jar包,直接导入的项目即可,方便省心

上一篇: Zookeeper详解
下一篇: Java动态代理(JDK)
Destiny_bobo
博客等级 码龄10年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值