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,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...
随机推荐
- 使用TestNG-xslt美化测试报告
用TestNG测试后,自动会生成html的测试报告,不过相信大家都有感觉,自动生成的测试报告太难看了,所以我们又用了ReportNG来美化它.在 这里给大家再介绍一下比reportNG还要稍稍美观一点 ...
- c++程序—输入
#include<iostream> using namespace std; #include<string> int main() { string str = " ...
- Maccms后门分析复现(并非官网的Maccms){10.15 第二十二天}
该复现参考网络中的文章,该漏洞复现仅仅是为了学习交流,严禁非法使用!!!! Maccms官网:http://www.maccms.cn/ Maccms网站基于PHP+MYSQL的系统,易用性.功能良好 ...
- POJ 3368:Frequent values
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14764 Accepted: 5361 ...
- 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...
- java课程课后作业190502之单词统计续集
第1步:输出单个文件中的前 N 个最常出现的英语单词. 功能1:输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列. 功能2: 指定文件目录,对目录下每一个文件执行统 ...
- 手把手教你用Python实现“坦克大战”,附详细代码!
小时候玩的“坦克大战”,你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygame1.9.6 ...
- matlab中自带的sobol的函数提供的sobol序列
clc; clear all; close all; M=;% 维度,几个参数 nPop=; VarMin=[0.6, 0.10, 0.002, 0.02, 0.17, 0.0, 0.17, 0.0, ...
- 《新标准C++程序设计》2.4-2.6(C++学习笔记4)
1.对象的内存匹配 一般来说,在C++中,一个对象占用的内存空间大小等于其成员变量所占用的内存空间的大小之和.(对象只包含成员变量,不包含成员函数) 每个对象都有各自的存储空间.一个对象的某个成员变 ...
- 二分+半平面交——poj1279
/* 二分距离,凸包所有边往左平移这个距离,半平面交后看是否还有核存在 */ #include<iostream> #include<cstring> #include< ...