• HTTP Components简介


    基于版本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

  • 相关阅读:
    迭代器特性
    没有一代人的青春是容易的『白岩松,演讲』
    编程趣话
    重新给PPT排序
    打印长图
    罗永浩答网友问:“能跟我们分享一件印象深刻至今你都记得的牛逼么?”
    活成加菲这样真是绝了!加菲语录大搜罗!
    加菲猫经典语录收录
    那些难以忘记的加菲猫经典语录
    做好这5点基本要求 才能算一个合格的HTML5动画
  • 原文地址:https://www.cnblogs.com/chrischennx/p/7464902.html
Copyright © 2020-2023  润新知