HTTP Components简介
来源:互联网 发布:办公软件培训班多少钱 编辑:程序博客网 时间:2024/06/10 17:20
基于版本4.5.x
简介
组件
- HttpClient,核心组件
- HC Fluent,提供了流式操作接口
- HttpMime,提供文件上传时用到的一些工具类
- HttpClient Cache,有待学习
- HttpClient OSGi,有待学习
特性
- 基于标准、纯净的Java语言。实现了Http1.0和Http1.1
- 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
- 支持HTTPS(基于SSL的HTTP)协议。
- 通过HTTP代理建立透明的连接。
- 利用CONNECT方法通过HTTP代理建立隧道的HTTPS连接。
- Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO, Kerberos认证方案。
- 插件式的自定义认证方案。
- 便携可靠的套接字工厂使它更容易的使用第三方解决方案(Pluggable secure socket factories, making it easier to use third party solutions)。
- 支持多线程应用的连接管理器。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
- 自动处理Set-Cookie中的Cookie。(Automatic Cookie handling for reading Set-Cookie: headers from the server and sending them back out in a Cookie: header when appropriate.)
- 插件式的自定义Cookie策略。
- Request的输出流可以避免流中内容直接缓冲到socket服务器。(Request output streams to avoid buffering any content body by streaming directly to the socket to the server.)
- Response的输入流可以有效的从socket服务器直接读取相应内容。
- 在http1.0和http1.1中利用KeepAlive保持持久连接。
- 直接获取服务器发送的response code和 headers。
- 可设置连接超时。
- 支持http1.1 response caching。
- 源代码基于Apache License 可免费获取。
Quick Start
HTTP Client
GET请求、POST请求 及 response处理
CloseableHttpClient httpclient = HttpClients.createDefault();//GET请求及response处理HttpGet httpGet = new HttpGet("http://targethost/homepage");CloseableHttpResponse response1 = httpclient.execute(httpGet);// The underlying HTTP connection is still held by the response object// to allow the response content to be streamed directly from the network socket.// In order to ensure correct deallocation of system resources// the user MUST call CloseableHttpResponse#close() from a finally clause.// Please note that if response content is not fully consumed the underlying// connection cannot be safely re-used and will be shut down and discarded// by the connection manager. try { System.out.println(response1.getStatusLine()); HttpEntity entity1 = response1.getEntity(); // do something useful with the response body // and ensure it is fully consumed EntityUtils.consume(entity1);} finally { response1.close();}//POST请求及response处理HttpPost httpPost = new HttpPost("http://targethost/login");List <NameValuePair> nvps = new ArrayList <NameValuePair>();nvps.add(new BasicNameValuePair("username", "vip"));nvps.add(new BasicNameValuePair("password", "secret"));httpPost.setEntity(new UrlEncodedFormEntity(nvps));CloseableHttpResponse response2 = httpclient.execute(httpPost);try { System.out.println(response2.getStatusLine()); HttpEntity entity2 = response2.getEntity(); // do something useful with the response body // and ensure it is fully consumed EntityUtils.consume(entity2);} finally { response2.close();}
官网的例子注释中有几点是需要注意的:
- 调用httpclient.execute(XXX)后,http连接会一直被response持有,需要调用CloseableHttpResponse#close(),当然也可是已使用jdk1.7的try-catch-resource。
- 如果response没有充分的被消耗掉(比如:chunk模式下,只取了部分),会被connection manager丢弃而不能复用,使用
EntityUtils.consume(entity)
可以确保response被充分消耗
HC Fluent 的流式接口
Request.Get("http://targethost/homepage") .execute().returnContent();Request.Post("http://targethost/login") .bodyForm(Form.form().add("username", "vip").add("password", "secret").build()) .execute().returnContent();
HttpMime 提交文件
multipart/form 类型的POST,下面例子中的FileBody、StringBody、MultipartEntityBuilder等都是HttpMine模块中的类。
public class ClientMultipartFormPost { public static void main(String[] args) throws Exception { if (args.length != 1) { System.out.println("File path not given"); System.exit(1); } CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost:8080" + "/fileUpload"); FileBody bin = new FileBody(new File(args[0])); StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create() .addPart("bin", bin) .addPart("comment", comment) .build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } finally { response.close(); } } finally { httpclient.close(); } }}
参考
HTTP Client使用详解
HttpClient Quick start
阅读全文
0 0
- HTTP Components简介
- HTTP Components简介
- HTTP Components简介
- Raize Components简介
- web components简介
- sentry简介--architecture and Components
- Http Components 使用相关资源
- MDAC (Microsoft Data Access Components)简介
- http://www.flashempire.com/school/components.php
- Http Core学习(Http Components 翻译和学习)
- HTTP简介
- HTTP简介
- HTTP简介
- HTTP简介
- HTTP简介
- http简介
- HTTP简介
- http简介
- 解决Idea创建maven-archetype-webapp项目无java目录的问题
- 2、笔记搭建一个个人网站——Wordpress WordPress
- 【01】Bootstrap入门
- Find Duplicate File in System
- 3、笔记搭建一个个人网站——环境准备
- HTTP Components简介
- [idea中配置maven]
- 09.02 问题解决(初步)
- C++面向对象
- Win7+VB6.0+access数据库出现实时错误“3078”的解决办法
- 常用设计模式
- WCF分布式开发步步为赢(1):WCF分布式框架基础概念
- C++语言中函数参数传递的三种方式
- Linux环境下加载动态链接库