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. json字符串格式化显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. python爬取网页文本、图片

    从网页爬取文本信息: eg:从http://computer.swu.edu.cn/s/computer/kxyj2xsky/中爬取讲座信息(讲座时间和讲座名称) 注:如果要爬取的内容是多页的话,网址 ...

  3. es6的...

    es6的...      (1):函数rest参数和扩展          sum1(...sum){//传多个参数             let total=0;             for( ...

  4. Nginx php-fpm 分离搭建 (上) 未完

    最近又重新看了一遍   'nginx入门到精通'      抽点时间 出来搭几个Demo  会有更深体会: Nginx如何与Php-fpm结合 Nginx不只有处理http请求的功能,还能做反向代理. ...

  5. 一、CI框架(CodeIgniter)简介

    CI是一个非常好用,非常灵活的PHP框架,在官网https://codeigniter.org.cn/ :最新版本3.1.10 版 就可以尽情使用了. 不忘初心,如果您认为这篇文章有价值,认同作者的付 ...

  6. 2019 年 Google 编程之夏活动报告

    2019 年 Google 编程之夏活动报告 主要介绍了 GSoC 2019 活动的几个课题并讲述了整个活动的组织过程 Google 编程之夏活动不仅仅是一个夏日的实习项目,对于组织和一些社区的成员来 ...

  7. css代码实现列表等宽

    实现上面的手机页面,我们会遇到一个自适应的问题,但是手机页面的屏幕大小不一致,自适应的问题不是百分比可以好好解决的,我采用下面的布局:display:flex; <!DOCTYPE html&g ...

  8. promise 核心技术3 使用

    什么是promise?(加深理解) 抽象表达:(比较高的高度 看这门技术) Promise是js中进行异步操作的新的解决方案(旧形式:纯回调的形式) 具体表达: 从语法上,Promise是一个构造函数 ...

  9. HDU - 1150 Machine Schedule(二分匹配---最小点覆盖)

    题意:有两台机器A和B,A有n种工作模式(0~n-1),B有m种工作模式(0~m-1),两台机器的初始状态都是在工作模式0处.现在有k(0~k-1)个工作,(i,x,y)表示编号为i的工作可以通过机器 ...

  10. python counter、闭包、generator、解数学方程、异常

    1.counter 2.闭包 3.generator 4.解数学方程 5.异常 1.python库——counter from collections import Counter breakfast ...