Apache HttpClient4使用教程
基于HttpClient 4.5.2
执行GET请求
CloseableHttpClient httpClient = HttpClients.custom()
.build();
CloseableHttpResponse response = httpClient.execute(new HttpGet("https://www.baidu.com"));
System.out.println(EntityUtils.toString(response.getEntity()));
执行POST请求
- 提交form表单参数
CloseableHttpClient httpClient = HttpClients.custom()
.build();
HttpPost httpPost = new HttpPost("https://www.explame.com");
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
//表单参数
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()));
- 提交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()));
- 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()));
- 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()));
- 提交form表单参数
设置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()));
设置重试处理器
当请求超时, 会自动重试,最多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"));
重定向策略
- HttpClient默认情况
会对302、307的GET和HEAD请求以及所有的303状态码做重定向处理 - 关闭自动重定向
CloseableHttpClient httpClient = HttpClients.custom()
//关闭httpclient重定向
.disableRedirectHandling()
.build();
- 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()));
- HttpClient默认情况
定制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维护。
- 方式一:通过addHeader方式设置(不推荐这种方式)
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"));
- 方式一:初始化HttpClient时,传入一个自己CookieStore对象
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()));
SSL配置
//默认信任
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(KeyStore.getInstance(KeyStore.getDefaultType())
, (chain, authType) -> true).build();
Registry<ConnectionSocketFactory> socketFactoryRegistry =
RegistryBuilder.<ConnectionSocketFactory>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()));
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<ConnectionSocketFactory> socketFactoryRegistry =
RegistryBuilder.<ConnectionSocketFactory>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()));
}
下载文件
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
版权声明
作者:wycm
出处:https://www.cnblogs.com/w-y-c-m/p/9237335.html
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Apache HttpClient4使用教程的更多相关文章
- CentOS6.0(64位)安装Apache+PHP+Mysql教程,安装Magento(解决DOM,Mcrypt,GD问题)完整教程
CentOS6.0(64位)安装Apache+PHP+Mysql教程,安装Magento(解决DOM,Mcrypt,GD问题)完整教程 0 Posted by :小黑 On : 2012 年 9 ...
- Tips & Tricks:Apache log4j简明教程(二)
在上一讲Apache log4j简明教程(一)中介绍了log4j的基本概念,配置文件,以及将日志写入文件的方法,并给出了一个详细的示例.这一讲,我在继续谈一谈如何使用log4j将日志写入MySQL数据 ...
- Tips & Tricks:Apache log4j简明教程(一)
Apache log4j的官方介绍是“log4j is a reliable, fast and flexible logging framework (APIs) written in Java, ...
- Apache Solr入门教程(初学者之旅)
Apache Solr入门教程(初学者之旅) 写在前面:本文涉及solr入门的各方面,建议边思考边实践,相信能帮助你对solr有个清晰全面的了解并能简单实用. 在Apache Solr初学者教程的这个 ...
- Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- Apache Pig中文教程集合
Apache Pig中文教程集合: http://www.codelast.com/?p=4550#more-4550
- 整合Apache与PHP教程
Apache下载安装完成后,PHP下载解压后,最重要的是如何将他们连接起来,就是整合到一起,让它们之间有联系,笔者根据自己多次配的经验和帮学弟学妹配时他们的理解程度整理了一个比较详细易理解的版本,下面 ...
- 【翻译】Apache Shiro10分钟教程
本文为翻译文,原文地址:http://shiro.apache.org/10-minute-tutorial.html 介绍 欢迎来到Apache Shiro的10分钟教程! 通过这个教程,你会明白一 ...
- Apache隐藏版本号教程(CentOS)
1 找到Apache配置文件/etc/httpd/conf/httpd.conf 2 给该文件添加写权限:chmod u+w httpd.conf 3 打开该文件找到ServerTokens字段将其值 ...
随机推荐
- iOS-代码修改Info.plist文件
解决办法: 1.首先系统的Info.Plist文件是只读文件 并不能 写入.目前我个人是没有办法存入,官方属性 可以看到是readOnly 2.那么我们 就想代码修改Info.Plist文件怎么办呢, ...
- django 文档
django 学习文档 https://yiyibooks.cn/xx/django_182/index.html
- 设计模式-UML类图基础
设计模式之序-UML类图那点事儿 打14年年底就像写那么一个系列,用于讲设计模式的,代码基于JAVA语言,最早接触设计模式是大一还是大二来着,那时候网上有人给推荐书,其中就有设计模式,当时给我推荐的书 ...
- LeetCode - Nth Highest Salary
题目大概意思是要求找出第n高的Salary,直接写一个Function.作为一个SQL新手我学到了1.SQL中Function的写法和变量的定义,取值.2.limit查询分 页的方法. 在这个题 ...
- [黑金原创教程] FPGA那些事儿《设计篇 III》- 图像处理前夕·再续
简介 一本为入门图像处理的入门书,另外还教你徒手搭建平台(片上系统),内容请看目录. 注意 为了达到最好的实验的结果,请准备以下硬件. AX301开发板, OV7670摄像模块, VGA接口显示器, ...
- ios 更改全局UINavigationBar的背景图片以及通知栏颜色
1.更改UINavigationController push 到另一个界面返回按钮的title self.navigationController.navigationBar.topItem.bac ...
- 最短路和次短路的条数(dijstra算法或spfa算法)POJ3463
http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- kmp的next数组的运用(求字符串的最小循环节)
hdu3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- Mybatis 搭配 阿里druid连接池 连接 oracle 或 mysql
DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...
- Java编程思想第四版勘误
坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...
