httpclient 具体解释——第一章。

httpclient 具体解释——第二章;

httpclient 具体解释——第三章;

httpclient 具体解释——第四章;

httpclient 具体解释——第五章;

httpclient 具体解释——第六章;

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 详细说明——第四章;的更多相关文章

  1. JAVA: httpclient 具体解释——第五章;

    httpclient 具体解释--第一章: httpclient 具体解释--第二章: httpclient 具体解释--第三章: httpclient 具体解释--第四章: httpclient 具 ...

  2. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. 《码出高效:Java开发手册》第四章学习记录,内容想当的多,前后花了几天的时间才整理好。

    <码出高效:Java开发手册>第四章学习记录,内容想当的多,前后花了几天的时间才整理好. https://naotu.baidu.com/file/e667435a4638cbaa15eb ...

  4. 《深入理解Java虚拟机》笔记--第四章、虚拟机性能监控与故障处理工具

    主要学习并记录在命令行中操作服务器时使用的六大命令工具,可视化工具JConsole和VisualVM在开发过程中熟悉. 一.jps:虚拟机进程状况工具(JVM Process Status Tool) ...

  5. java多线程编程核心技术——第四章总结

    第一节使用ReentrantLock类 1.1使用ReentrantLock实现同步:测试1 1.2使用ReentrantLock实现同步:测试2 1.3使用Condition实现等待/同步错误用法与 ...

  6. 初读"Thinking in Java"读书笔记之第四章 ---控制执行流程

    true和false Java不允许将数字作为布尔值使用. 所有条件表达式都将布尔值作为判断条件,决定执行路径. if-lese 迭代 while,do-while,for为三个迭代语句. ,逗号操作 ...

  7. Java编程基础篇第四章

    循环结构 循环结构的分类 for循环,while循环,do...while()循环 for循环 注意事项: a:判断条件语句无论简单还是复杂结果是boolean类型 b:循环体语句如果是一条语句,大括 ...

  8. Java基础知识笔记第四章:类和对象

      编程语言的几个发展阶段 面向机器语言 面向过程语言 面向对象语言:封装.继承.多态 类 类声明 class Person{ ....... } class 植物{ ....... } 类体 类使用 ...

  9. java 面向对象编程--第十四章 多线程编程

    1.  多任务处理有两种类型:基于进程和基于线程. 2.  进程是指一种“自包容”的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存. 3.  线程是进程内部单一的 ...

随机推荐

  1. Android Bitmap 载入与像素操作

    Android Bitmap 载入与像素操作 一:载入与像素读写 在Android SDK中,图像的像素读写能够通过getPixel与setPixel两个Bitmap的API实现. Bitmap AP ...

  2. hdu 2082 生成函数

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2082 找单词 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  3. Study note for Continuous Probability Distributions

    Basics of Probability Probability density function (pdf). Let X be a continuous random variable. The ...

  4. Windows phone 8 学习笔记(5) 图块与通知

    原文:Windows phone 8 学习笔记(5) 图块与通知 基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认 ...

  5. Cocos2d-x Layout简单使用

    1. Text* alert = Text::create("Layout", "fonts/Marker Felt.ttf", 30 ); alert-> ...

  6. el表达式 分页提交 中文乱码

    el表达式 分页提交 中文乱码 网上找了很多资料,没能解决我的问题.并不是说网上的那些资料不好.而是不适用于我的问题吧. 看看的的问题: 原始页面 单击下一页 , 乱码. 引起的原因则是因为自己的js ...

  7. Microsoft Build 2016 Day 2

    Microsoft Build 2016 Day 2 Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩, ...

  8. python几道简单的算法题

    最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十 ...

  9. Solaris 10下使用Python3

    通常在Solaris 10上仅仅能使用Python2.x. 假设使用Python3的话,一种就是http://www.sunfreeware.com获取可用的二进制版本号.只是眼下这个站点已经不提供免 ...

  10. Windows上的的神技

    Windows上的的神技 不用借助任何第三方软件,其实Windows也大有可为——比你目前了解得至少要多得多,强大技能快来get起来! 1.文件隐藏谁的电脑里没点小秘密?东藏西藏到最后自己都找不到了有 ...