热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApacheHttpClient4使用教程

基于HttpClient4.5.2执行GET请求CloseableHttpClienthttpClientHttpClients.custom().build();Close

基于HttpClient 4.5.2

  1. 执行GET请求
    CloseableHttpClient httpClient = HttpClients.custom() .build(); CloseableHttpResponse respOnse= httpClient.execute(new HttpGet("https://www.baidu.com")); System.out.println(EntityUtils.toString(response.getEntity()));
  2. 执行POST请求
    1. 提交form表单参数
      CloseableHttpClient httpClient = HttpClients.custom() .build(); HttpPost httpPost = new HttpPost("https://www.explame.com"); List formParams = new ArrayList(); //表单参数 formParams.add(new BasicNameValuePair("name1", "value1")); formParams.add(new BasicNameValuePair("name2", "value2")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "utf-8"); httpPost.setEntity(entity); CloseableHttpResponse respOnse= httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity()));
    2. 提交payload参数
      CloseableHttpClient httpClient = HttpClients.custom() .build(); HttpPost httpPost = new HttpPost("https://www.explame.com"); StringEntity entity = new StringEntity("{\"id\": \"1\"}"); httpPost.setEntity(entity); CloseableHttpResponse respOnse= httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity()));
    3. post上传文件
      CloseableHttpClient httpClient = HttpClients.custom() .build(); HttpPost httpPost = new HttpPost("https://www.example.com"); MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); //要上传的文件 multipartEntityBuilder.addBinaryBody("file", new File("temp.txt")); httpPost.setEntity(multipartEntityBuilder.build()); CloseableHttpResponse respOnse= httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity()));
    4. post提交multipart/form-data类型参数
      CloseableHttpClient httpClient = HttpClients.custom() .build(); HttpPost httpPost = new HttpPost("https://www.example.com"); MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); multipartEntityBuilder.addTextBody("username","wycm"); multipartEntityBuilder.addTextBody("passowrd","123"); //文件 multipartEntityBuilder.addBinaryBody("file", new File("temp.txt")); httpPost.setEntity(multipartEntityBuilder.build()); CloseableHttpResponse respOnse= httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity()));
  3. 设置User-Agent
    CloseableHttpClient httpClient = HttpClients.custom() .setUserAgent("Mozilla/5.0") .build(); CloseableHttpResponse respOnse= httpClient.execute(new HttpGet("https://www.baidu.com")); System.out.println(EntityUtils.toString(response.getEntity()));
  4. 设置重试处理器
    当请求超时, 会自动重试,最多3次
    HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> { if (executionCount >= 3) { return false; } if (exception instanceof InterruptedIOException) { return true; } if (exception instanceof UnknownHostException) { return true; } if (exception instanceof ConnectTimeoutException) { return true; } if (exception instanceof SSLException) { return true; } HttpClientContext clientCOntext= HttpClientContext.adapt(context); HttpRequest request = clientContext.getRequest(); boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); if (idempotent) { return true; } return false; }; CloseableHttpClient httpClient = HttpClients.custom() .setRetryHandler(retryHandler) .build(); httpClient.execute(new HttpGet("https://www.baidu.com"));

  5. 重定向策略
    1. HttpClient默认情况
      会对302、307的GET和HEAD请求以及所有的303状态码做重定向处理
    2. 关闭自动重定向
      CloseableHttpClient httpClient = HttpClients.custom() //关闭httpclient重定向 .disableRedirectHandling() .build();
    3. POST支持302状态码重定向
      CloseableHttpClient httpClient = HttpClients.custom() //post 302支持重定向 .setRedirectStrategy(new LaxRedirectStrategy()) .build(); CloseableHttpResponse respOnse= httpClient.execute(new HttpPost("https://www.explame.com")); System.out.println(EntityUtils.toString(response.getEntity()));
  6. 定制COOKIE
    • 方式一:通过addHeader方式设置(不推荐这种方式)
      CloseableHttpClient httpClient = HttpClients.custom() .build(); HttpGet httpGet = new HttpGet("http://www.example.com"); httpGet.addHeader("COOKIE", "name=value"); httpClient.execute(httpGet);
      由于HttpClient默认会维护COOKIE状态。如果这个请求response中有Set-COOKIE头,那下次请求的时候httpclient默认会把这个COOKIE带上。并且会新建一行header。如果再遇到
      httpGet.addHeader("COOKIE", "name=value");
      那么下次请求则会有两行name为COOKIE的header。
    • 方式二:通过COOKIEStore的方式,以浏览器中的COOKIE为例(推荐)
      //此处直接粘贴浏览器COOKIE final String RAW_COOKIES = "name1=value1; name2=value2"; final COOKIEStore COOKIEStore = new BasicCOOKIEStore(); for (String rawCOOKIE : RAW_COOKIES.split("; ")){ String[] s = rawCOOKIE.split("="); BasicClientCOOKIE COOKIE = new BasicClientCOOKIE(s[0], s[1]); COOKIE.setDomain("baidu.com"); COOKIE.setPath("/"); COOKIE.setSecure(false); COOKIE.setAttribute("domain", "baidu.com"); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, +5); COOKIE.setExpiryDate(calendar.getTime()); COOKIEStore.addCOOKIE(COOKIE); } CloseableHttpClient httpClient = HttpClients.custom() .setDefaultCOOKIEStore(COOKIEStore) .build(); httpClient.execute(new HttpGet("https://www.baidu.com"));
      这种方式把定制的COOKIE交给httpclient维护。
  7. COOKIE管理
    • 方式一:初始化HttpClient时,传入一个自己COOKIEStore对象
      COOKIEStore COOKIEStore = new BasicCOOKIEStore(); CloseableHttpClient httpClient = HttpClients.custom() .setDefaultCOOKIEStore(COOKIEStore) .build(); httpClient.execute(new HttpGet("https://www.baidu.com")); //请求一次后,清理COOKIE再发起一次新的请求 COOKIEStore.clear(); httpClient.execute(new HttpGet("https://www.baidu.com"));
    • 方式二:每次执行请求的时候传入自己的HttpContext对象
      //注:HttpClientContext不是线程安全的,不要多个线程维护一个HttpClientContext HttpClientContext httpCOntext= HttpClientContext.create(); CloseableHttpClient httpClient = HttpClients.custom() .build(); httpClient.execute(new HttpGet("https://www.baidu.com"), httpContext); //请求一次后,清理COOKIE再发起一次新的请求 httpContext.getCOOKIEStore().clear(); httpClient.execute(new HttpGet("https://www.baidu.com"));
  8. http代理的配置
    CloseableHttpClient httpClient = HttpClients.custom() //设置代理 .setRoutePlanner(new DefaultProxyRoutePlanner(new HttpHost("localhost", 8888))) .build(); CloseableHttpResponse respOnse= httpClient.execute(new HttpGet("http://www.example.com")); System.out.println(EntityUtils.toString(response.getEntity()));
  9. SSL配置
    //默认信任 SSLContext sslCOntext= SSLContexts.custom() .loadTrustMaterial(KeyStore.getInstance(KeyStore.getDefaultType()) , (chain, authType) -> true).build(); Registry socketFactoryRegistry = RegistryBuilder.create() .register("http", new SocketProxyPlainConnectionSocketFactory()) .register("https", new SocketProxySSLConnectionSocketFactory(sslContext)) .build(); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(new PoolingHttpClientConnectionManager(socketFactoryRegistry)) .build(); HttpClientContext httpClientCOntext= HttpClientContext.create(); httpClientContext.setAttribute("socks.address", new InetSocketAddress("127.0.0.1", 1086)); CloseableHttpResponse respOnse= httpClient.execute(new HttpGet("https://httpbin.org/ip"), httpClientContext); System.out.println(EntityUtils.toString(response.getEntity()));
  10. socket代理配置

    static class SocketProxyPlainConnectionSocketFactory extends PlainConnectionSocketFactory{
        @Override
        public Socket createSocket(final HttpContext context) {
            InetSocketAddress socksAddr = (InetSocketAddress) context.getAttribute("socks.address");
            if (socksAddr != null){
                Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksAddr);
                return new Socket(proxy);
            } else {
                return new Socket();
            }
        }
    }
    static class SocketProxySSLConnectionSocketFactory extends SSLConnectionSocketFactory {
        public SocketProxySSLConnectionSocketFactory(final SSLContext sslContext) {
            super(sslContext, NoopHostnameVerifier.INSTANCE);
        }
    
        @Override
        public Socket createSocket(final HttpContext context) {
            InetSocketAddress socksAddr = (InetSocketAddress) context.getAttribute("socks.address");
            if (socksAddr != null){
                Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksAddr);
                return new Socket(proxy);
            } else {
                return new Socket();
            }
        }
    
    }
    /**
     * socket代理配置
     */
    public static void socketProxy() throws Exception {
        //默认信任
        SSLContext sslCOntext= SSLContexts.custom()
                .loadTrustMaterial(KeyStore.getInstance(KeyStore.getDefaultType())
                        , (X509Certificate[] chain, String authType) -> true).build();
        Registry socketFactoryRegistry =
                RegistryBuilder.create()
                        .register("http", new SocketProxyPlainConnectionSocketFactory())
                        .register("https", new SocketProxySSLConnectionSocketFactory(sslContext))
                        .build();
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(new PoolingHttpClientConnectionManager(socketFactoryRegistry))
                .build();
        HttpClientContext httpClientCOntext= HttpClientContext.create();
        httpClientContext.setAttribute("socks.address", new InetSocketAddress("127.0.0.1", 1086));
        CloseableHttpResponse respOnse= httpClient.execute(new HttpGet("https://httpbin.org/ip"), httpClientContext);
        System.out.println(EntityUtils.toString(response.getEntity()));
    }
  11. 下载文件

    CloseableHttpClient httpClient = HttpClients.custom().build();
    CloseableHttpResponse respOnse= httpClient.execute(new HttpGet("https://www.example.com"));
    InputStream is = response.getEntity().getContent();
    Files.copy(is, new File("temp.png").toPath(), StandardCopyOption.REPLACE_EXISTING);
    

    最后

  • 完整Demo源码下载地址:https://github.com/wycm/HttpClientDemo

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
author-avatar
落墨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有