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. 线程是进程内部单一的 ...
随机推荐
- Thinkphp中的volist标签(查询数据集(select方法)的结果输出)用法简介
参考网址:http://camnpr.com/archives/1515.html 通常volist标签多用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数 ...
- Eclipse中的SVN的冲突解决方案详解
版本冲突原因: 假设A.B两个用户都在版本号为100的时候,更新了kingtuns.txt这个文件,A用户在修改完成之后提交kingtuns.txt到服务器,这个时候提交成功,这个时候kingtuns ...
- centos6搭建本地openstack软件源
1.把相关软件包所有下载到本地机器 wget -np -nH –cut-dirs=1 -r -c -L –exclude-directories=repodata –accept=rpm,gz,xml ...
- Android在如何建立一个WebServer
今天老板交待任务最终完成了,感觉收获颇多,所以写一个关于它的记录,首先,看一下.老板的需求 需求: 希望移动端的用户标识(IMEI)和HTML页面的用户标识(Cookie)连接起来,当中HTML页面可 ...
- CCNA CCNP CCIE所有实验名称完整版
实验1:通过Console端口访问Cisco路由器 实验2:通过Telnet访问Cisco路由器 实验3:配置终端服务器 实验4:通过浏览器访问路由器 实验5:模式切换.上下文帮助及查看有关信 ...
- JAVA 命令参数详解System.setProperty(
JAVA 命令参数详解: 1.-D<name>=<value> set a system property 设置系统属性. java -D参数简化加入多个jar java命令 ...
- Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍
原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iO ...
- oracle nologging用法(转)
一.oracle日志模式分为(logging,force logging,nologging) 默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nolo ...
- oracle转mysql总结(转)
ares-sdk初始开发测试使用的是oracle数据库,由于宁波通商的特殊需要,必须把数据库环境从oracle转向mysql. 现对转换过程中出现的问题及经验总结如下: 主键生成策略 创建一个专门记录 ...
- android 设置默认启动network mode
network mode常见类型 WCDMA preferred : 0 GSM only : 1 WCDMA only : 2 GSM UMTS : 3 CDMA : 4 ... (参考RILCon ...