Apache HttpClient 客户端使用详解
目录
HttpClient 概述与下载
Http Get 请求
Http POST 请求
Http Put 请求
Http Delete 请求
异步执行请求
HttpClient 概述与下载
1、本文的 HttpClient 是指 Apache 官网 HttpComponents 项目下的子项目 HttpClient 。
2、如果项目使用手动导入 Jar 包的方式,则可以从官网下载,地址:http://hc.apache.org/downloads.cgi
3.1、Maven 依赖:如果是 Maven 项目,则可以从 Maven 中央仓库获取依赖,如果不需要做文件上传,或者异步请求操作,则可以只导入 httpclient 依赖:
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>
3.2、如果需要做文件上传,或者异步请求操作,则需要导入 httpasyncclient、httpmime 依赖:
<!--httpclient 异步请求客户端依赖,内部包含:httpclient、httpcore 依赖--><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpasyncclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpasyncclient</artifactId><version>4.1.4</version></dependency><!---httpclient 文件上传依赖--><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.13</version><exclusions><exclusion><artifactId>httpclient</artifactId><groupId>org.apache.httpcomponents</groupId></exclusion></exclusions></dependency>
4、使用 HttpClient 发送请求主要分为以下几步:
创建 CloseableHttpClient(同步) 对象或 CloseableHttpAsyncClient(异步) 对象
创建 Http 请求对象
调用 execute 方法执行请求,如果是异步请求在执行之前需调用 start 方法
5、HTTP 协议是一个广泛应用的 Internet 协议,提供了8个不同的请求方式(常见的是前 4 个):
请求方式 | 描述 |
GET | 向特定资源发出请求(请求指定页面信息,并返回实体主体) |
POST | 向指定资源提交数据进行处理请求(提交表单、上传文件) |
PUT | 向指定资源位置上上传其最新内容 |
DELETE | 请求服务器删除指定的资源 |
HEAD | |
OPTIONS | |
TRACE | |
CONNECT |
Http Get 请求
1、get 请求通常适用于请求对方的资源,或者类似做心跳的功能,如果是做有大量数据需要传输给对方时,应该采用 post 方式。
2、使用步骤:
//1、创建 CloseableHttpClient 同步请求对象
CloseableHttpClient httpClient = HttpClientBuilder.create().build();// 2、HttpGet(final String uri):创建 http get 请求对象
HttpGet httpGet = new HttpGet(url);// 3、设置超时时间、请求时间、socket 时间都为 15 秒,允许重定向
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(15000).setConnectionRequestTimeout(15000).setSocketTimeout(15000).setRedirectsEnabled(true).build();
httpGet.setConfig(requestConfig);// 4、CloseableHttpResponse execute(final HttpUriRequest request):执行请求
// 如果连接不上服务器,则抛出:java.net.ConnectException: Connection refused: connect
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);// 5、获取响应结果, 状态码 200 表示请求成功
int statusCode = httpResponse.getStatusLine().getStatusCode();
System.out.println("响应状态码:" + statusCode);
if (statusCode == 200) {HttpEntity httpEntity = httpResponse.getEntity();// 使用指定的字符编码解析响应消息实体String feedback = EntityUtils.toString(httpEntity,"UTF-8");System.out.println("feedback:" + feedback);
}
3、在线演示源码:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/apachestudy/httpclient/HttpGetTest.java
Http POST 请求
1、向指定资源提交数据进行处理请求(提交表单、上传文件),使用步骤:
//1、创建 CloseableHttpClient 同步请求对象
httpClient = HttpClientBuilder.create().build();// 2、HttpPost(final String uri):创建 http post 请求对象, 设置请求头信息
String url = "https://news.ssp.qq.com/app";
httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type", "application/json;charset=utf8");// 3、设置 post 请求正文参数
String postParams = "{\"adReqData\":{\"chid\":9,\"adtype\":0,\"uin\":null,\"qq_openid\":\"\",\"slot\":[{\"loid\":\"1\",\"cur\":0,\"channel\":\"world\",\"orders_info\":[],\"article_id\":\"\",\"refresh_type\":1,\"current_rot\":\"\",\"seq\":\"\",\"seq_loid\":\"\"}],\"netstatus\":\"unknown\",\"pf\":\"pc\",\"appversion\":\"200717\",\"plugin_news_cnt\":20,\"plugin_page_type\":\"\",\"plugin_text_ad\":false,\"plugin_bucket_id\":\"\"}}";
httpPost.setEntity(new StringEntity(postParams, "UTF-8"));// 4、CloseableHttpResponse execute(final HttpUriRequest request):执行请求
// 如果连接不上服务器,则抛出:java.net.ConnectException: Connection refused: connect
httpResponse = httpClient.execute(httpPost);// 5、获取响应结果, 状态码 200 表示请求成功
int statusCode = httpResponse.getStatusLine().getStatusCode();
System.out.println("响应状态码:" + statusCode);
if (statusCode == 200) {HttpEntity httpEntity = httpResponse.getEntity();// 使用指定的字符编码解析响应消息实体String feedback = EntityUtils.toString(httpEntity, "UTF-8");System.out.println("feedback:" + feedback);
}
2、在线演示源码:
https://github.com/apache-study/java/com/wmx/apachestudy/httpclient/HttpPostTest.java
https://github.com/apache-study/java/com/wmx/apachestudy/controller/ResourceController.java
Http Put 请求
1、接口提供方如下,put 操作请求方与 post 请求完全类似。
/*** 修改提交时调用此接口, put 请求: http://localhost:8080/example/httpPut?info=put请求** @param dataMap* @return*/@PutMapping("example/httpPut")public Map<String, Object> httpPut(@RequestBody Map<String, Object> dataMap, String info) {System.out.println("dataMap=" + dataMap);System.out.println("info=" + info);Map<String, Object> dataMpa = new HashMap<>();dataMpa.put("code", 200);dataMpa.put("msg", "success");dataMpa.put("data", dataMap);return dataMpa;}
2、在线演示源码:
https://github.com/src/main/java/com/wmx/apachestudy/controller/ResourceController.java
https://github.com//src/main/java/com/wmx/apachestudy/httpclient/HttpPutTest.java
Http Delete 请求
1、接口提供方如下,delete 操作请求方与 get 请求完全类似。
@DeleteMapping("example/httpDelete")public Map<String, Object> httpDelete(String info) {System.out.println("info =" + info);Map<String, Object> dataMpa = new HashMap<>();dataMpa.put("code", 200);dataMpa.put("msg", "success");dataMpa.put("data", null);return dataMpa;}
2、在线演示源码:
https://github.com/src/main/java/com/wmx/apachestudy/controller/ResourceController.java
https://github.com//apache-study/java/com/wmx/apachestudy/httpclient/HttpDeleteTest.java
异步执行请求
1、对一些不需要等待执行结果的请求,可以进行异步调用。
/*** CloseableHttpAsyncClient 异步执行 http 请求*/@Testpublic void testDelete2() {String url = "http://localhost:8080/example/httpDelete?info=delete请求";//1、创建 CloseableHttpAsyncClient 异步请求对象CloseableHttpAsyncClient httpAsyncClient = HttpAsyncClientBuilder.create().build();// 2、HttpDelete(final String uri):创建 http delete 请求对象, 设置请求头信息HttpDelete httpDelete = new HttpDelete(url);// 3、Future<HttpResponse> execute(final HttpUriRequest request,FutureCallback<HttpResponse> callback):执行请求// 异步请求在执行之前需调用 start 方法// FutureCallback 是异步执行的回调接口httpAsyncClient.start();httpAsyncClient.execute(httpDelete, new FutureCallback<HttpResponse>() {@Overridepublic void completed(HttpResponse result) {try {System.out.println("成功:" + result);String feedback = EntityUtils.toString(result.getEntity(), "UTF-8");System.out.println("feedback:" + feedback);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void failed(Exception ex) {//比如对方服务没启动,连接失败,就会进这里System.out.println("失败:" + ex);}@Overridepublic void cancelled() {System.out.println("取消");}});try {TimeUnit.SECONDS.sleep(5);//主线程阻塞5秒,让异步执行完成.} catch (InterruptedException e) {e.printStackTrace();}}
Apache HttpClient 客户端使用详解相关推荐
- Apache HttpClient 客户端使用详解、文件上传、文件下载
目录 HttpClient 概述与下载 Http Get 请求(文件下载) Http POST 请求(文件上传) Http Put 请求 Http Delete 请求 异步执行请求 HttpClien ...
- Apache Thrift - java开发详解
2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...
- Apache配置文件httpd.conf详解
转自:http://www.jianshu.com/p/c36dd3946e74 Apache配置文件httpd.conf详解 Apache的配置由httpd.conf文件配置,因此下面的配置指令都是 ...
- 【linux】apache的访问日志详解及演练
文章目录 前言 一. apache日志分类 二. apache的日志格式详解 1. 输出最近的一段访问日志 2. 日志的字段所代表的内容如下: 3. apache访问日志配置文件参数详解 三. 配置修 ...
- Apache 虚拟主机设置详解
Apache 虚拟主机设置详解 我们通常所说的虚拟主机技术就是将一台(或者一组)服务器的资源(系统资源.网络带宽.存储空间等)按照一定的比例分割成若干台相对独立的"小主机"的技术. ...
- Apache 的 httpd.conf 详解 【转】
文章来源:Apache 的 httpd.conf 详解(很实用) ServerRoot "/usr/local" ServerRoot用于指定守护进程httpd的运行目录,http ...
- Apache 的 httpd.conf 详解
ServerRoot "/usr/local" ServerRoot用于指定守护进程httpd的运行目录,httpd在启动之后将自动将进程的当前目录改变为这个目录,因此如果设置文件 ...
- HttpClient 源码详解之HttpEntity
HttpClient 源码详解 之HttpEntity 1. 类释义 An entity that can be sent or received with an HTTP message. Enti ...
- Apache+PHP配置过程详解
Apache+PHP配置过程详解 经过两晚上的奋斗终于将Apache配置PHP成功,安装配置过程中走了不少弯路,特记录之. 1.Apache配置PHP个人认为首先要注意的是Apache和PHP的版本信 ...
- SVN的Windows和Linux客户端操作详解
SVN的Windows和Linux客户端操作详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Windows客户端操作 1.安装SVN客户端 a>.去官网下载svn软件 ...
最新文章
- openssl在64位的机器上编译32位的库
- tcp/ip 协议栈Linux内核源码分析九 IPv6分片ip6_fragment 分析
- java: Comparable比较器,数组对象比较器
- 《python接口自动化测试》笔记
- 好用的HTML文本编辑器BBEdit for Mac
- 电商购物核心架构演进:谁说架构思路会过时?
- 1007 Maximum Subsequence Sum(25 分)
- vue全家桶+element-UI
- fla 优化思路 flash cs6
- 遍历文件夹下所有文件
- 函数对称性常见公式_函数的对称性
- 以太网链路捆绑原理实验
- php+chmod+r,从今往后,谁再告诉你Linux上chmod -R 777解决权限,果断绝交
- MIT JOS LAB12学习笔记
- 啥都不说了,今天就是要送书!
- 华为GAUSSDB集成
- 我与OutLook有个约会
- python爬取网站的某一句话_Python实现JS解密并爬取某音漫客网站
- C# 通过反射根据描述特性转换枚举型值
- 分布式读写锁-redisson的读锁和写锁