HttpClient apache上篇
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实体分为以下三种:streamed、self-contained、wrapping。
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上篇的更多相关文章
- Android HttpURLConnection And HttpClient
Google的工程师的一个博客写到: HttpURLConnection和HttpClient Volley HTTP请求时:在Android 2.3及以上版本,使用的是HttpURLConnecti ...
- Apache 项目列表功能分类便于技术选型
big-data (49): Apache Accumulo Apache Airavata Apache Ambari Apache Apex Apache Avro Apache Be ...
- HttpClient和HttpURLConnection的使用和区别(上)
转自:点击打开链接 相信很多Android开发者碰到涉及到Http协议的需求时,都和我一样在犹豫是使用HttpClient还是使用HttpURLConnection呢.我在网上也搜索了很多文章,来分析 ...
- android基础(五)网络编程
android 的网络编程一般可以分为两种:基于Socket的,基于Http的. 一.socket与Http socket封装了TCP/IP协议,TPC/IP协议是传输层协议,主要解决数据如何在网络中 ...
- Android 文章列表
Android --列表-- Android(1)-Handler Looper Message MessageQueuehttp://www.cnblogs.com/TS-qrt/articles ...
- Android项目框架升级尝鲜OkHttp
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 随着项目日趋稳定,需求不再总是变化,那么是时间来整理下项目了.先简单介绍下,本项目最初使用loop4 ...
- Curl的编译
下载 curl的官网:https://curl.haxx.se/ libcurl就是一个库,curl就是使用libcurl实现的. curl是一个exe,也可以说是整个项目的名字,而libcurl就是 ...
- ASF (0) - ASF Java 项目总览
Apache .NET Ant Library This is a library of Ant tasks that help developing .NET software. It includ ...
- 架构选型之Nodejs与Java
前言: 身边越来越多的同事谈论Nodejs,谈其异步IO.事件回调.前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...
随机推荐
- spring boot配置druid连接池连接mysql
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- 【题解】Acting Cute
题目简介 正在 rainbow 的城堡游玩的 Freda 恰好看见了在地毯上跳舞卖萌的水叮当--于是-- Freda:"呜咕>_< 我也要卖萌T_T!" rainbow ...
- 【剑指Offer】面试题09. 用两个栈实现队列
题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,delete ...
- 颜色设置 <color name="white">#FFFFFF</color><!--白色 -->
<?xml version="1.0" encoding="utf-8"?> <resources> <color name=&q ...
- storm on yarn安装时 提交到yarn失败 failed
最近在部署storm on yarn ,部署参考文章 http://www.tuicool.com/articles/BFr2Yvhttp://blog.csdn.net/jiushuai/artic ...
- java课程之团队开发冲刺阶段2.3
一.总结昨天进度 1.完成整合功能 二.遇到的问题 1.在整合的过程中,总是发现在switch开关提醒了两次,后来发现是因为我使用了setChecked方法,而这个方法触发onCheckedChang ...
- 201812-2 小明放学 Java
思路: 红绿灯每种灯亮划分区间,在[0,r]区间内红灯亮,在(r,g+r]区间内绿灯亮,在(r+g,r+g+y]区间内黄灯亮,在划分好区间后只需要判断当小明到达红绿灯时是哪个灯在亮,就可以判断出通过红 ...
- Java中String类为什么被设计为final?
Java中String类为什么被设计为final 首先,String是引用类型,也就是每个字符串都是一个String实例.通过源码可以看到String底层维护了一个byte数组:private f ...
- redis(七)---- SpringBoot和redis整合
SpringBoot和Redis整合非常简单 添加pom依赖 <dependency> <groupId>org.springframework.boot</groupI ...
- 基于百度语音识别API的Python语音识别小程序
一.功能概述 实现语音为文字,可以扩展到多种场景进行工作,这里只实现其基本的语言接收及转换功能. 在语言录入时,根据语言内容的多少与停顿时间,自动截取音频进行转换. 工作示例: 二.软件环境 操作系统 ...