{"id":19993144,"url":"https://github.com/Arronlong/httpclientutil","last_synced_at":"2025-05-04T12:30:53.218Z","repository":{"id":45229500,"uuid":"46473766","full_name":"Arronlong/httpclientutil","owner":"Arronlong","description":"该项目基于HttpClient-4.4.1封装的一个工具类。提供了更为简单的GET、POST及上传下载等功能。同时支持插件式配置Http-Header（包含自定义header）、配置SSL和Proxy等。","archived":false,"fork":false,"pushed_at":"2023-12-16T18:22:25.000Z","size":229,"stargazers_count":1411,"open_issues_count":25,"forks_count":719,"subscribers_count":117,"default_branch":"master","last_synced_at":"2025-04-13T19:50:05.139Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://blog.csdn.net/xiaoxian8023/category_9264781.html","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Arronlong.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-11-19T06:53:28.000Z","updated_at":"2025-03-18T12:21:59.000Z","dependencies_parsed_at":"2024-11-29T03:11:57.177Z","dependency_job_id":"5c9ba309-2fe9-4f5d-a800-0792940ab8a6","html_url":"https://github.com/Arronlong/httpclientutil","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arronlong%2Fhttpclientutil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arronlong%2Fhttpclientutil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arronlong%2Fhttpclientutil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arronlong%2Fhttpclientutil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Arronlong","download_url":"https://codeload.github.com/Arronlong/httpclientutil/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252334152,"owners_count":21731348,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T04:52:29.027Z","updated_at":"2025-05-04T12:30:48.209Z","avatar_url":"https://github.com/Arronlong.png","language":"Java","funding_links":[],"categories":["Java","网络编程"],"sub_categories":[],"readme":"# httpclientutil （QQ群[548452686](http://shang.qq.com/wpa/qunwpa?idkey=4fae0ff61968c0a25a08318ad42cfff7509542c26a1894706a9b7d1845b0bf68 \"httpclientUtil交流\") ![image](http://pub.idqqimg.com/wpa/images/group.png)）\r\n\r\n该项目基于HttpClient-4.4.1封装的一个工具类，支持插件式配置Header、插件式配置httpclient对象，这样就可以方便地自定义header信息、配置ssl、配置proxy等。\r\n\r\n## Maven坐标：\r\n```\r\n\u003c!-- https://mvnrepository.com/artifact/com.arronlong/httpclientutil --\u003e\r\n\u003cdependency\u003e\r\n    \u003cgroupId\u003ecom.arronlong\u003c/groupId\u003e\r\n    \u003cartifactId\u003ehttpclientutil\u003c/artifactId\u003e\r\n    \u003cversion\u003e1.0.4\u003c/version\u003e\r\n\u003c/dependency\u003e\r\n```\r\n\r\n## 简单Demo\r\n在test包里还有各种测试[demo](http://mfxuan.free.800m.net/demo.png)，各测试类的源码在src/test/java/com/httpclient/test包路径下。\r\n```\r\npublic static void main(String[] args) throws HttpProcessException, FileNotFoundException {\r\n\tString url = \"https://github.com/Arronlong/httpclientutil\";\r\n\t\r\n\t//最简单的使用：\r\n\tString html = HttpClientUtil.get(HttpConfig.custom().url(url));\r\n\tSystem.out.println(html);\r\n\t\r\n\t//---------------------------------\r\n\t//\t\t\t【详细说明】\r\n\t//--------------------------------\r\n\t\r\n\t//插件式配置Header（各种header信息、自定义header）\r\n\tHeader[] headers = HttpHeader.custom()\r\n\t\t\t\t\t\t \t\t .userAgent(\"javacl\")\r\n\t\t\t\t\t\t\t\t .other(\"customer\", \"自定义\")\r\n\t\t\t\t\t\t\t\t .build();\r\n\t\r\n\t//插件式配置生成HttpClient时所需参数（超时、连接池、ssl、重试）\r\n\tHCB hcb = HCB.custom()\r\n\t\t\t\t .timeout(1000) //超时\r\n\t\t\t\t .pool(100, 10) //启用连接池，每个路由最大创建10个链接，总连接数限制为100个\r\n\t\t\t\t .sslpv(SSLProtocolVersion.TLSv1_2) \t//设置ssl版本号，默认SSLv3，也可以调用sslpv(\"TLSv1.2\")\r\n\t\t\t\t .ssl()  \t  \t//https，支持自定义ssl证书路径和密码，ssl(String keyStorePath, String keyStorepass)\r\n\t\t\t\t .retry(5)\t\t//重试5次\r\n\t\t\t\t ;\r\n\t\r\n\tHttpClient client = hcb.build();\r\n\t\r\n\tMap\u003cString, Object\u003e map = new HashMap\u003cString, Object\u003e();\r\n\tmap.put(\"key1\", \"value1\");\r\n\tmap.put(\"key2\", \"value2\");\r\n\t\r\n\t//插件式配置请求参数（网址、请求参数、编码、client）\r\n\tHttpConfig config = HttpConfig.custom()\r\n\t                              .headers(headers)\t//设置headers，不需要时则无需设置\r\n\t                              .url(url)\t          //设置请求的url\r\n\t                              .map(map)\t          //设置请求参数，没有则无需设置\r\n\t                              .encoding(\"utf-8\") //设置请求和返回编码，默认就是Charset.defaultCharset()\r\n\t                              .client(client)    //如果只是简单使用，无需设置，会自动获取默认的一个client对象\r\n\t                              //.inenc(\"utf-8\")  //设置请求编码，如果请求返回一直，不需要再单独设置\r\n\t                              //.inenc(\"utf-8\")\t//设置返回编码，如果请求返回一直，不需要再单独设置\r\n\t                              //.json(\"json字符串\")                          //json方式请求的话，就不用设置map方法，当然二者可以共用。\r\n\t                              //.context(HttpCookies.custom().getContext()) //设置cookie，用于完成携带cookie的操作\r\n\t                              //.out(new FileOutputStream(\"保存地址\"))       //下载的话，设置这个方法,否则不要设置\r\n\t                              //.files(new String[]{\"d:/1.txt\",\"d:/2.txt\"}) //上传的话，传递文件路径，一般还需map配置，设置服务器保存路径\r\n\t                              ;\r\n\t\r\n\t\r\n\t//使用方式：\r\n\tString result1 = HttpClientUtil.get(config);     //get请求\r\n\tString result2 = HttpClientUtil.post(config);    //post请求\r\n\tSystem.out.println(result1);\r\n\tSystem.out.println(result2);\r\n\t\r\n\t//HttpClientUtil.down(config);                   //下载，需要调用config.out(fileOutputStream对象)\r\n\t//HttpClientUtil.upload(config);                 //上传，需要调用config.files(文件路径数组)\r\n\t\r\n\t//如果指向看是否访问正常\r\n\t//String result3 = HttpClientUtil.head(config); // 返回Http协议号+状态码\r\n\t//int statusCode = HttpClientUtil.status(config);//返回状态码\r\n\t\r\n\t//[新增方法]sendAndGetResp，可以返回原生的HttpResponse对象，\r\n\t//同时返回常用的几类对象：result、header、StatusLine、StatusCode\r\n\tHttpResult respResult = HttpClientUtil.sendAndGetResp(config);\r\n\tSystem.out.println(\"返回结果：\\n\"+respResult.getResult());\r\n\tSystem.out.println(\"返回resp-header：\"+respResult.getRespHeaders());//可以遍历\r\n\tSystem.out.println(\"返回具体resp-header：\"+respResult.getHeaders(\"Date\"));\r\n\tSystem.out.println(\"返回StatusLine对象：\"+respResult.getStatusLine());\r\n\tSystem.out.println(\"返回StatusCode：\"+respResult.getStatusCode());\r\n\tSystem.out.println(\"返回HttpResponse对象）（可自行处理）：\"+respResult.getResp());\r\n}\r\n```\r\n\r\n![image](http://box.kancloud.cn/cover_2016-01-11_5693502e2de2_800x1068.jpg?imageMogr2/thumbnail/346x462!/interlace/1/quality/100)| 专栏创建者：[xiaoxian8023](http://blog.csdn.net/xiaoxian8023)\u003cbr/\u003e创建时间：2015-11-16\u003cbr/\u003e文章数：17篇\u003cbr/\u003e[RSS订阅](http://blog.csdn.net/xiaoxian8023/rss/list)\u003cbr/\u003e \u003cbr/\u003e[轻松把玩HttpClient](http://blog.csdn.net/column/details/httpclient-arron.html)\u003cbr/\u003e介绍如何使用HttpClient，通过一些简单示例，来帮助初学者快速入手。\u003cbr/\u003e同时提供了一个非常强大的工具类，比现在网络上分享的都强大：\u003cbr/\u003e支持插件式设置header、代理、ssl等配置信息，支持携带Cookie的操作，支持http的各种方法，支持上传、下载等功能。\r\n---|---\r\n\r\n\r\n---\r\n\r\n# 最新更新文章\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(九)，添加多文件上传功能](http://blog.csdn.net/xiaoxian8023/article/details/53065507)\r\n```\r\n在Git上有人给我提Issue，说怎么上传文件，其实我一开始就想上这个功能，不过这半年比较忙，所以一直耽搁了。\r\n这次正好没什么任务了，赶紧完成这个功能。毕竟作为一款工具类，有基本的请求和下载功能，就差上...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(八)，优化启用Http连接池策略](http://blog.csdn.net/xiaoxian8023/article/details/53064210)\r\n```\r\n写了HttpClient工具类后，有人一直在问我怎么启用http连接池，其实我没考虑过这个问题难过。\r\n不过闲暇的时候，突然间想起了这个问题，就想把这个问题搞一搞。\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(七)，新增验证码识别功能](http://blog.csdn.net/xiaoxian8023/article/details/51606865)\r\n```\r\n这个HttpClientUtil工具类分享在GitHub上已经半年多的时间了，并且得到了不小的关注，有25颗star，被fork了38次。\r\n有了大家的鼓励，工具类一直也在完善中。最近比较忙，两个多月前的修改在今天刚修改测试完成，今天再次分享给大家。\r\n验证码识别这项技术并不是本工具类的功能，而是通过一个开源的api来识别验证码的。\r\n这里做了一个简单的封装，主要是用来解决登陆时的验证码的问题。...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(六)，封装输入参数，简化工具类](http://blog.csdn.net/xiaoxian8023/article/details/50768320)\r\n```\r\n在写这个工具类的时候发现传入的参数太多，以至于方法泛滥，只一个send方法就有30多个，\r\n所以对工具类进行了优化，把输入参数封装在一个对象里，这样以后再扩展输入参数，直接修改这个类就ok了。\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(五)，携带Cookie的请求](http://blog.csdn.net/xiaoxian8023/article/details/50474987)\r\n```\r\n最近更新了一下HttpClientUtil工具类代码，主要是添加了一个参数HttpContext，这个是用来干嘛的呢？\r\n其实是用来保存和传递Cookie所需要的。因为我们有很多时候都需要登录，然后才能请求一些想要的数据。\r\n而在这以前使用HttpClientUtil工具类，还不能办到。现在更新了以后，终于可以了。\r\n先说一下思路：本次的demo，就是获取csdn中的c币，要想获取c币，必须先登...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpAsyncClient之模拟post请求示例](http://blog.csdn.net/xiaoxian8023/article/details/49949813)\r\n```\r\n如果看到过我前些天写过的《轻松把玩HttpClient之模拟post请求示例》这篇文章，你再看本文就是小菜一碟了，如果你顺便懂一些NIO，基本上是毫无压力了。\r\n因为HttpAsyncClient相对于HttpClient，就多了一个NIO，这也是为什么支持异步的原因。\r\n不过我有一个疑问，虽说NIO是同步非阻塞IO，但是HttpAsyncClient提供了回调的机制，\r\n这点儿跟netty很像，所以可以模拟...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(四)，单线程调用及多线程批量调用测试](http://blog.csdn.net/xiaoxian8023/article/details/49910885)\r\n```\r\n本文主要来分享一下该工具类的测试结果。工具类的整体源码不再单独分享，源码基本上都已经在文章中了。\r\n开始我们的测试。单线程调用测试：\r\n    public static void testOne() throws HttpProcessException{\r\n\t\t\r\n\t\tSystem.out.println(\"--------简单方式调用（默认post）--------\");\r\n\t\tString url = \"http://...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(三)，插件式配置Header](http://blog.csdn.net/xiaoxian8023/article/details/49910127)\r\n```\r\n上篇文章介绍了插件式配置HttpClient，本文将介绍插件式配置Header。为什么要配置header在前面已经提到了，还里再简单说一下，\r\n要使用HttpClient模拟请求，去访问各种接口或者网站资源，都有可能有各种限制，\r\n比如说java客户端模拟访问csdn博客，就必须设置User-Agent，否则就报错了。\r\n还有各种其他情况，必须的设置一些特定的Header，才能请求成功，或者才能不出问题。好了...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(二)，插件式配置HttpClient对象](http://blog.csdn.net/xiaoxian8023/article/details/49909359)\r\n```\r\n上一篇文章中，简单分享一下封装HttpClient工具类的思路及部分代码，本文将分享如何实现插件式配置HttpClient对象。\r\n如果你看过我前面的几篇关于HttpClient的文章或者官网示例，应该都知道HttpClient对象在创建时，都可以设置各种参数，\r\n但是却没有简单的进行封装，比如对我来说比较重要的3个：\r\n代理、ssl（包含绕过证书验证和自定义证书验证）、超时。还需要自己写。\r\n所以这里我就简单封...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之封装HttpClient工具类(一)（现有网上分享中的最强大的工具类）](http://blog.csdn.net/xiaoxian8023/article/details/49883113)\r\n```\r\n搜了一下网络上别人封装的HttpClient，大部分特别简单，有一些看起来比较高级，但是用起来都不怎么好用。\r\n调用关系不清楚，结构有点混乱。所以也就萌生了自己封装HttpClient工具类的想法。\r\n要做就做最好的，本工具类支持插件式配置Header、插件式配置httpclient对象，\r\n这样就可以方便地自定义header信息、配置ssl、配置proxy等。是不是觉得说的有点悬乎了，那就先看看调用吧：...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之设置代理，可以访问FaceBook](http://blog.csdn.net/xiaoxian8023/article/details/49867257)\r\n```\r\n前面的文章介绍了一些HttpClient的简单示例，本文继续采用示例的方式来演示HttpClient的功能。\r\n在项目中我们可能会遇到这样的情况：为了保证系统的安全性，只允许使用特定的代理才可以访问，\r\n而与这些系统使用HttpClient进行交互时，只能为其配置代理。\r\n这里我们使用gogent代理访问脸书来模拟这种情况。现在在浏览器上访问是可以访问的：...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之配置ssl，采用设置信任自签名证书实现https](http://blog.csdn.net/xiaoxian8023/article/details/49866397)\r\n```\r\n在上篇文章《HttpClient配置ssl实现https简单示例——绕过证书验证》中简单分享了一下如何绕过证书验证。\r\n如果你想用httpclient访问一个网站，但是对方的证书没有通过ca认证或者其他问题导致证书不被信任，\r\n比如12306的证书就是这样的。所以对于这样的情况，你只能是选择绕过证书验证的方案了。\r\n但是，如果是自己用jdk或者其他工具生成的证书，还是希望用其他方式认证自签名的证书，这篇文...\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之配置ssl，采用绕过证书验证实现https](http://blog.csdn.net/xiaoxian8023/article/details/49865335)\r\n```\r\n上篇文章说道httpclient不能直接访问https的资源，这次就来模拟一下环境，然后配置https测试一下。\r\n在前面的文章中，分享了一篇自己生成并在tomcat中配置ssl的文章《Tomcat配置SSL》，大家可以据此来在本地配置https。\r\n我已经配置好了，效果是这样滴：\r\n可以看到已经信任该证书（显示浅绿色小锁），浏览器可以正常访问。现在我们用代码测试一下：\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [轻松把玩HttpClient之模拟post请求示例](http://blog.csdn.net/xiaoxian8023/article/details/49863967)\r\n```\r\nHttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。\r\n许多需要后台模拟请求的系统或者框架都用的是httpclient。所以作为一个java开发人员，有必要学一学。\r\n本文提供了一个简单的demo，供初学者参考。\r\n```\r\n## ![image](http://static.blog.csdn.net/images/icon-zhuanjia.gif \"专家\") [简单的利用UrlConnection，后台模拟http请求](http://blog.csdn.net/xiaoxian8023/article/details/49785417)\r\n```\r\n这两天在整理看httpclient，然后想自己用UrlConnection后台模拟实现Http请求，于是一个简单的小例子就新鲜出炉了（支持代理哦）：\r\n  public class SimpleHttpTest {\r\n\r\n\tpublic static String send(String urlStr, Map map,String encoding){\r\n\t\tString body=\"\";\r\n\t\tStrin...\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FArronlong%2Fhttpclientutil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FArronlong%2Fhttpclientutil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FArronlong%2Fhttpclientutil/lists"}