1.什么是HttpClient

  Http 是Hyper-Text Transfer Protocol简写,迄今为止互联网应用最广泛的协议。网络服务、互联网应用、网络计算需求的增长,持续推动http协议应用范围不断扩展。

  java.net包提供http方式访问资源的最基本功能,httpClient在其基础上提供功能更丰富、更灵活的http请求能力,例如web浏览器、web服务客户端或扩展http协议进行分布式通信等。

2.基本功能及概念

http request : 所有http请求是由方法名+请求URI+HTTP协议版本号组成。HttpClient提供所有方法的封装类:HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions.

HttpGet httpget = new HttpGet(
"http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");

http response: http response是server收到request请求并响应后,返回给client的消息。httpClient返回信息 包括协议版本号+返回码+文本。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");

http headers:Http消息(包括request、response)可以包含一部分属性字段,用来描述消息,例如:content length、content type等等

http entity(实体): HTTP协议定义post和put请求能携带内容实体,默认response都应该封闭实体,但是HEAD方法的response和204,304,205返回例外。根据内容来源,http实体分为以下三种:streamedself-containedwrapping

3.连接管理

Connection persistence : HttpClient支持长连接。一次连接握手的消耗是很明显的,如果多个请求能复用连接,吞吐率能得到明显提升。

HTTP connection routing : HttpClient支持直接和间接路由访问目标host。HttpRoutePlanner 接口提供路由策略。

Secure HTTP connections :如果http 连接上传输的信息不能被未授权的第三方获取,则认为是安全连接。SSL/TLS protocol是应用最广泛的安全连接协议,一般都是http协议都是通过SSL/TLS加密传输。

HTTP connection managers:  Http连接是复杂、状态的、线程不安全特点,需要连接管理确保功能可用。Http连接每次只能给一个正在执行的线程用。HttpClient使用HttpClientConnectionManager接口定义的实体类来管理访问http连接。ManagedHttpClientConnection作为一个实际连接的代理,管理连接状态和控制IO操作。

Multithreaded request execution: 

当使用连接池PoolingClientConnectionManager时,HttpClient支持同时并发多个线程执行多个请求。虽然HttpClient实例是线程安全的,文档仍然建议每个线程拥有专属的HttpContext。

Connection eviction policy(连接驱逐策略):经典的阻塞IO模式下的一个重要缺陷是,网络socket只在IO操作阻塞时,才能对IO事件作出反应。当连接释放给manager后,连接仍然保持活,但是不能监测socket状态,也不能处理任何IO事件。HttpClient使用一个专门的监测线程,赶走那些长时间不活动的连接。周期性调用ClientConnectionManager#closeExpiredConnections(),关闭超期连接并从连接池驱赶已关闭连接。

Connection keep alive strategy(连接保持策略):

Http Servers使用Keep-Alive header告诉client,server侧打算保持这个连接的时长秒数。如果字段keep-alive没有指定,默认情况下server会关闭长时间不活动的连接。为了防止默认保持策略可能效果不够好,可以定义自己的 ConnectionKeepAliveStrategy myStrategy。

Connection socket factories: 

ConnectionSocketFactor接口提供创建、初始化、连接socket,PlainConnectionSocketFactory是默认创建、初始化不加密sockets。

Hostname verification(主机名校验): 

为了信任校验和客户端授权,HttpClient可选的验证target hostname是否匹配server X.509证书中的主机名单,这个验证机制保证server授权的连接。X509HostnameVerifier接口表示主机校验。

HttpClient proxy configuration:HttpClient仅支持直连或者一跳代理。通过代理访问,即配置默认代理参数,如下

HttpHost proxy = new HttpHost("someproxy", 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();

或者使用标准JRE proxy选择器获取代理信息:

SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(
ProxySelector.getDefault());
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();

或者实现RoutePlanner:

HttpRoutePlanner routePlanner = new HttpRoutePlanner() {
public HttpRoute determineRoute(
HttpHost target,
HttpRequest request,
HttpContext context) throws HttpException {
return new HttpRoute(target, null, new HttpHost("someproxy", 8080),
"https".equalsIgnoreCase(target.getSchemeName()));
}
};
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();
}
}

HttpClient apache上篇的更多相关文章

  1. Android HttpURLConnection And HttpClient

    Google的工程师的一个博客写到: HttpURLConnection和HttpClient Volley HTTP请求时:在Android 2.3及以上版本,使用的是HttpURLConnecti ...

  2. Apache 项目列表功能分类便于技术选型

    big-data (49):  Apache Accumulo  Apache Airavata  Apache Ambari  Apache Apex  Apache Avro  Apache Be ...

  3. HttpClient和HttpURLConnection的使用和区别(上)

    转自:点击打开链接 相信很多Android开发者碰到涉及到Http协议的需求时,都和我一样在犹豫是使用HttpClient还是使用HttpURLConnection呢.我在网上也搜索了很多文章,来分析 ...

  4. android基础(五)网络编程

    android 的网络编程一般可以分为两种:基于Socket的,基于Http的. 一.socket与Http socket封装了TCP/IP协议,TPC/IP协议是传输层协议,主要解决数据如何在网络中 ...

  5. Android 文章列表

    Android  --列表-- Android(1)-Handler Looper Message MessageQueuehttp://www.cnblogs.com/TS-qrt/articles ...

  6. Android项目框架升级尝鲜OkHttp

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 随着项目日趋稳定,需求不再总是变化,那么是时间来整理下项目了.先简单介绍下,本项目最初使用loop4 ...

  7. Curl的编译

    下载 curl的官网:https://curl.haxx.se/ libcurl就是一个库,curl就是使用libcurl实现的. curl是一个exe,也可以说是整个项目的名字,而libcurl就是 ...

  8. ASF (0) - ASF Java 项目总览

    Apache .NET Ant Library This is a library of Ant tasks that help developing .NET software. It includ ...

  9. 架构选型之Nodejs与Java

    前言: 身边越来越多的同事谈论Nodejs,谈其异步IO.事件回调.前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...

随机推荐

  1. java如何连接Oracle数据库问题

    Oracle数据库纯属自学,不对请留言改正! 在学Oracle前相信已经大致知道mysql或sqlserver数据库,这个跟前面两个不大一样,你安装的时候让你输入一个密码,貌似是一个系统管理员密码,跟 ...

  2. hdu 3308 线段树,单点更新 求最长连续上升序列长度

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. 【转载】webdriver 自动化测试如何定位到动态变化ID的iframe框内

    大家知道,在自动化测试脚本编写过程中,如果页面上跳出一个iframe框时,我们是定位不到框内内容的,可以通过 driver.findElement(By.id("")); driv ...

  4. python练习(一)----打印九九乘法表

    打印九九乘法表 ,): ,i+): print("{0} x {1} = {2} \t".format(j,i,i*j),end='') //print默认end=‘\n’, pr ...

  5. UVA - 11093 Just Finish it up(环形跑道)(模拟)

    题意:环形跑道上有n(n <= 100000)个加油站,编号为1~n.第i个加油站可以加油pi加仑.从加油站i开到下一站需要qi加仑汽油.你可以选择一个加油站作为起点,起始油箱为空(但可以立即加 ...

  6. PHP的变量作用域-常亮-全局变量-表单提交变量

    一.变量的作用域 作用域是指在一个脚本中某个变量在哪些地方可以使用或可见. 内置超级全局变量可以在脚本的任何地方使用和可见. 常量,一旦被声明,将可以在全局可见.也就是说,他们可以在函数内外使用. 在 ...

  7. UVALive 4043 转化最佳完美匹配

    首先黑点和白点是组成一个二分图这毫无疑问 关键是题目中要求的所有黑白配的线不能交叉...一开始我也没想到这个怎么转化为二分图里面的算法. 后来看书才知道,如果两两交叉,则可以把两根线当四边形的对角线, ...

  8. Spring AOP复习

    最近在翻<Spring In Action>Spring 实战这本书,重新了解了一下AOP的概念和思想并写了一个小Demo示例,记录在这里: 环境:intelliJ IDEA 2018.M ...

  9. 不使用.h .lib文件使用DLL内的函数

    #include <windows.h> typedef int (*Func)(const char *fmt, ...); //这里声明一个函数指针,typedef 关键字是必须的,好 ...

  10. Linux下mysql5.7安装

    当前最新版本为5.7,此次将分别采用yum安装和tar包编译安装的方式分别说明. 一.Yum安装 A:获取repo源 [root@localhost ~]# wget http://dev.mysql ...