JAVA: httpclient 详细说明——第四章;
相对于httpurlconnection ,httpclient更加丰富,也更加强大,当中apache有两个项目都是httpclient。一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的。所以我一般用后者;
httpclient能够处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等...
以下是測试代码(所有总结来自官方文档。以及翻译)
需要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache.org/downloads.cgi
/**
* HTTP认证:
*
* HTTPclient支持http标准认证,也支持其它认证,如NTLM和SPNEGO。
*/
private static void test17(){ //最简单的明文username password认证。
UsernamePasswordCredentials creds = new UsernamePasswordCredentials("user", "pwd");
System.out.println(creds.getUserPrincipal().getName());
System.out.println(creds.getPassword()); /**
* NTCredentials是微软的windows系统使用的一种凭据。包括username、password,还包括一系列其它的属性。
* 比方用户所在的域名。在Microsoft Windows的网络环境中,同一个用户能够属于不同的域,所以他也就有不同的凭据。
* workstation:本机的计算机名
*/
NTCredentials ntcreds = new NTCredentials("user", "pwd", "workstation", "domain");
System.out.println(ntcreds.getUserPrincipal().getName());//输出 DOMAIN/user
System.out.println(ntcreds.getPassword()); } /**
* 凭证提供者(CredentialsProvider)内含一套特定的凭证,需要哪种凭证时,CredentialsProvider就能获得相应的凭证。
* 获取凭证的时候,能够模糊的指定主机名、port号、realm和认证方案。
* CredentialsProvider会筛选出一个最佳匹配方案。
*/
private static void test18() { CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials(new AuthScope("somehost",AuthScope.ANY_PORT),
new UsernamePasswordCredentials("u1", "p1"));
credsProvider.setCredentials(new AuthScope("somehost", 8080),
new UsernamePasswordCredentials("u2", "p2"));
credsProvider.setCredentials(new AuthScope("otherhost", 8080,AuthScope.ANY_REALM, "ntlm"),
new UsernamePasswordCredentials("u3", "p3")); System.out.println(credsProvider.getCredentials(new AuthScope(
"somehost", 80, "realm", "basic")));
System.out.println(credsProvider.getCredentials(new AuthScope(
"somehost", 8080, "realm", "basic")));
System.out.println(credsProvider.getCredentials(new AuthScope(
"otherhost", 8080, "realm", "basic")));
System.out.println(credsProvider.getCredentials(new AuthScope(
"otherhost", 8080, null, "ntlm"))); /**
* 输出:
* [principal: u1]
[principal: u2]
null
[principal: u3]
*/
} private static void test19() throws ClientProtocolException, IOException { // CloseableHttpClient httpclient = HttpClients.createDefault();
// HttpClientContext context = HttpClientContext.create();
//
// HttpHost targetHost = new HttpHost("webservice.webxml.com.cn", 80, "http");
//
// //认证提供者
// CredentialsProvider credsProvider = new BasicCredentialsProvider();
// credsProvider.setCredentials(new AuthScope(targetHost.getHostName(),targetHost.getPort()),
// new UsernamePasswordCredentials("root", "root"));
//
// //基础认证缓存
// AuthCache authCache = new BasicAuthCache();
//
// context.setCredentialsProvider(credsProvider);
// context.setAuthCache(authCache);
//
// HttpGet httpget = new HttpGet("/WebServices/MobileCodeWS.asmx/getDatabaseInfo");
//
// CloseableHttpResponse response = httpclient.execute(targetHost,httpget, context);
//
// AuthState proxyAuthState = context.getProxyAuthState();
//
// System.out.println("Proxy auth state: " + proxyAuthState.getState());
// System.out.println("Proxy auth scheme: "+ proxyAuthState.getAuthScheme());
// System.out.println("Proxy auth credentials: "+ proxyAuthState.getCredentials());
// AuthState targetAuthState = context.getTargetAuthState();
// System.out.println("Target auth state: " + targetAuthState.getState());
// System.out.println("Target auth scheme: "+ targetAuthState.getAuthScheme());
// System.out.println("Target auth credentials: "+ targetAuthState.getCredentials());
/**
* Proxy auth state: UNCHALLENGED
Proxy auth scheme: null
Proxy auth credentials: null
Target auth state: UNCHALLENGED
Target auth scheme: null
Target auth credentials: null
*/
} /**
* HttpClientContext 设置抢先认证 和 认证提供者:
*
* 在HTTP中。基本认证是一种用来同意Web浏览器或其它客户端程序在请求时提供以username和口令形式的凭证。
*
* 一般http basic认证,首先登录server。 然后server会返回401码让客户端输入username和password,客户端把usernamepassword进行BASE64加密。
*
* 最后把加密后的username和password发送给server进行验证。
*
* 抢先验证则省略了前几部,直接发送BASE64位密文,进行验证。但存在风险,慎用。
*/
private static void test20() throws ClientProtocolException, IOException { HttpClientContext context = HttpClientContext.create();
CloseableHttpClient httpclient = HttpClients.createDefault();
//配置主机 。 port可任意填写
HttpHost targetHost = new HttpHost("webservice.webxml.com.cn", 80, "http");
//认证提供者
CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials(
new AuthScope(targetHost.getHostName(),targetHost.getPort()),
new UsernamePasswordCredentials("username", "password")); AuthCache authCache = new BasicAuthCache(); BasicScheme basicAuth = new BasicScheme();
authCache.put(targetHost, basicAuth); //提前填充认证信息缓存到上下文中,这样,以这个上下文运行的方法。就会使用抢先认证。 可能会出错
context.setAuthCache(authCache);
context.setCredentialsProvider(credsProvider); HttpGet httpget = new HttpGet("/WebServices/MobileCodeWS.asmx/getDatabaseInfo"); CloseableHttpResponse response = httpclient.execute(targetHost,httpget, context);
try {
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
System.out.println(result); } finally {
response.close();
}
} /**
* NTLM连接认证:
*
* windows提供的一套安全、复杂的、有状态的协议。
*
* 相比Basic和Digest认证。NTLM认证要明显需要很多其它的计算开销,性能影响也比較大。 *
* 也就是说,NTLM连接一旦建立,用户的身份就会在其整个生命周期和它相关联。
*/
private static void test21() throws ClientProtocolException, IOException { // 确保使用同一个上下文
HttpClientContext context = HttpClientContext.create();
CloseableHttpClient httpclient = HttpClients.createDefault(); CredentialsProvider credsProvider = new BasicCredentialsProvider();
//构建具体nt认证信息:NTCredentials 參数1:username 2:password 3:本机名 3:domain域
credsProvider.setCredentials(new AuthScope("somehost",AuthScope.ANY_PORT) ,
new NTCredentials("username", "password", "myworkstation", "domain")); context.setCredentialsProvider(credsProvider); HttpHost target = new HttpHost("somehost", 80, "http"); HttpGet httpget = new HttpGet("/"); CloseableHttpResponse response1 = httpclient.execute(target, httpget, context); try {
HttpEntity entity1 = response1.getEntity();
System.out.println(EntityUtils.toString(entity1,"GB2312"));
} finally {
response1.close();
} HttpPost httppost = new HttpPost("/");
httppost.setEntity(new StringEntity("lots and lots of data"));
CloseableHttpResponse response2 = httpclient.execute(target, httppost, context);
try {
HttpEntity entity2 = response2.getEntity();
} finally {
response2.close();
} }
版权声明:本文博主原创文章,博客,未经同意不得转载。
JAVA: httpclient 详细说明——第四章;的更多相关文章
- JAVA: httpclient 具体解释——第五章;
httpclient 具体解释--第一章: httpclient 具体解释--第二章: httpclient 具体解释--第三章: httpclient 具体解释--第四章: httpclient 具 ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 《码出高效:Java开发手册》第四章学习记录,内容想当的多,前后花了几天的时间才整理好。
<码出高效:Java开发手册>第四章学习记录,内容想当的多,前后花了几天的时间才整理好. https://naotu.baidu.com/file/e667435a4638cbaa15eb ...
- 《深入理解Java虚拟机》笔记--第四章、虚拟机性能监控与故障处理工具
主要学习并记录在命令行中操作服务器时使用的六大命令工具,可视化工具JConsole和VisualVM在开发过程中熟悉. 一.jps:虚拟机进程状况工具(JVM Process Status Tool) ...
- java多线程编程核心技术——第四章总结
第一节使用ReentrantLock类 1.1使用ReentrantLock实现同步:测试1 1.2使用ReentrantLock实现同步:测试2 1.3使用Condition实现等待/同步错误用法与 ...
- 初读"Thinking in Java"读书笔记之第四章 ---控制执行流程
true和false Java不允许将数字作为布尔值使用. 所有条件表达式都将布尔值作为判断条件,决定执行路径. if-lese 迭代 while,do-while,for为三个迭代语句. ,逗号操作 ...
- Java编程基础篇第四章
循环结构 循环结构的分类 for循环,while循环,do...while()循环 for循环 注意事项: a:判断条件语句无论简单还是复杂结果是boolean类型 b:循环体语句如果是一条语句,大括 ...
- Java基础知识笔记第四章:类和对象
编程语言的几个发展阶段 面向机器语言 面向过程语言 面向对象语言:封装.继承.多态 类 类声明 class Person{ ....... } class 植物{ ....... } 类体 类使用 ...
- java 面向对象编程--第十四章 多线程编程
1. 多任务处理有两种类型:基于进程和基于线程. 2. 进程是指一种“自包容”的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存. 3. 线程是进程内部单一的 ...
随机推荐
- Eclipse常用热键
,Ctrl+D 删除选中的几行 ,Alt+上下箭头 移动选中的代码块 ,Alt+左右箭头 回退 前进 ,Alt+Shift+上下箭头 复制选中的代码块 ,sysout+Ctrl space 生成Sys ...
- The Swift Programming Language 中国版
iSwifting社会的 Swift 兴趣交流群:303868520 iOS 微信公众账号:iOSDevTip Swift 微信公众账号:SwiftDev iSwifting社区 假设你认为这个项目不 ...
- SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF
原文:SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF 本来用 Writer 写一篇关于一列多行合并的博客来的,结果快写完了时候,在一个插入代码时候,崩了,重新打开,居然 ...
- 基于.net开发chrome核心浏览器【二】
原文:基于.net开发chrome核心浏览器[二] 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一] 二: 相关资源介绍: chrome Frame: 让IE有一颗chrome的心, ...
- 初识缓存以及ehcache初体验
1.缓存的意义 缓存机制就是将数据库中经常使用的数据取出放入内存中.程序调用时直接从内存中取,丌用每次使用 数据都訪问数据库,这样提高了效率. 2.缓存须要关注的问题 1) 缓存的更新 缓存中的数 ...
- GUI测试要点
本人测试知识还不完整,所以下面的文字总结自网络上的文章,红色字体为我平时的测试经验,如有雷同之处,还请见谅,仅自己学习之用. 转载请说明来自博客园--邦邦酱好. ------------------- ...
- eclipse重构详解(转)
重构是对软件内部结构的一种调整,目的是在不改变软件行为的前提下,提高其可理解性,降低其修改成本.开发人员可以使用一系列重构准则,在不改变软件行为的前提下,调整软件的结构. 有很多种原因,开发人员应该重 ...
- Webservice-初级实例(二)
去年这个时候在亿阳工作,经理让我做数据同步功能,用到WS,于是草草研究之后,就投入使用了.前两天同事给我讲解分配给我的项目时,讲到其中一块是数据同步功能,我不禁一笑,同事问笑什么,我说世界真是奇妙,去 ...
- J2SE基础:4.面向对象的特性一
面向对象的特性 封装 继承多态 封装: 定义: 通过对象的封装,实现了模块化和信息隐藏. 通过对类的成员施以一定的訪问权限,实现了类中成员 的信息隐藏 注意点: 对象自已该做的一些事情与方法不能交与其 ...
- 内网port映射具体解释(花生壳)
关于怎样建立服务器的解答. 一.花生壳的作用 首先,我们先来了解一下花生壳的究竟有什么作用.由于ADSL每次拨号上网所获得的IP地址每次都是不同的,花生壳起到的作用就是方便用户訪问我们的server( ...