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

原创粉丝点击