HttpClient Java客户端 青旅半醒 2023-10-10 11:29 18阅读 0赞 #### 文章目录 #### * HttpClient Java客户端 * * 建立使用HttpClient的环境 * HttpGet请求 * HttpGet带参请求 * HttpPost请求 * HttpPost带参请求(提交表单数据) * HttpClient连接池+请求配置 ## HttpClient Java客户端 ## **HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。** **HttpClient主要功能:** 1. 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) 2. 支持自动转向 3. 支持 HTTPS 协议 4. 支持代理服务器等 **(以上资料来自百度百科)** ### 建立使用HttpClient的环境 ### 如果创建的是maven项目的话可以导入依赖: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> 如果创建的是JavaWeb项目的话可以直接引入Jar包:`httpclient-4.5.2.jar`。 *想要其他版本的HttpClient工具的话可以搜索`maven HttpClient`下载。* 这样就可以使用HttpClient来请求浏览器了。 **HttpClient请求的步骤大致分为几步**(类似人操作浏览器的步骤): 1. 创建HttpClient的连接(打开浏览器建立与浏览器的连接) 2. 创建请求,输入URI地址向浏览器发起请求(手动输入URI地址) 3. HttpClient请求URI地址(浏览器中按回车发起请求) 4. 拿到response响应数据(浏览器接收数据,解析渲染到页面) 以上就完成了从请求到接收数据的一个过程。下面看一下简单实现。 ### HttpGet请求 ### 以GET请求的方式向百度贴吧发送一个请求: //HttpClient发送GET请求 public class HttpGetRequest { public static void main(String[] args) { //百度贴吧的uri地址 String uri = "https://tieba.baidu.com/index.html"; //1、创建HttpClient连接 CloseableHttpClient httpClient = HttpClients.createDefault(); //2、创建HtpGet请求 HttpGet httpGet = new HttpGet(uri); //3、HttpClient发送请求 CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet); //4、拿到请求页面的返回数据,请求成功才有数据啊! HttpEntity entity = null; if (response != null && response.getStatusLine().getStatusCode() == 200) { //获取服务器返回的实体数据 entity = response.getEntity(); //把实体数据转换成指定类型的字符串 String context = EntityUtils.toString(entity, "utf-8"); System.out.println(context); } } catch (IOException e) { e.printStackTrace(); //发送请求异常 } finally { //不管如何关闭响应、请求的连接 if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } if (httpClient != null) { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 返回数据的部分截图: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center] ### HttpGet带参请求 ### 在返回的这部分数据中找到一个请求地址发送一个带参数的GET请求,就以请求`乘风破浪的姐姐`为例: //HttpClient发送带参数的GET请求 public class HttpGetRequestParam { public static void main(String[] args) { //百度贴吧的uri地址 String uri = "https://tieba.baidu.com/f"; // --> /f:就是二级地址:注意地址一定要正确哦!一不小心就会404 //1、创建HttpClient连接 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; try { //1.5、封装GET请求的参数 URIBuilder uriBuilder = new URIBuilder(uri); //第一种:setParameter放参数 uriBuilder.setParameter("kw", "乘风破浪的姐姐"); //uriBuilder.setParameter("kw","乘风破浪的姐姐").setParameter("t","其他参数"); //第二种:放参数 //List<NameValuePair> params = new ArrayList<>(); //params.add(new BasicNameValuePair("kw", "乘风破浪的姐姐")); //params.add(new BasicNameValuePair("t", "其他")); //uriBuilder.setParameters(params); //第三种:放参数 //uriBuilder.setParameters(new BasicNameValuePair("kw", "乘风破浪的姐姐"), // new BasicNameValuePair("t", "其他参数")); //2、创建HtpGet请求:uriBuilder.build() HttpGet httpGet = new HttpGet(uriBuilder.build()); //3、HttpClient发送请求 response = httpClient.execute(httpGet); //4、拿到请求页面的返回数据,请求成功才有数据啊! HttpEntity entity = null; if (response != null && response.getStatusLine().getStatusCode() == 200) { //获取服务器返回的实体数据 entity = response.getEntity(); //把实体数据转换成指定类型的字符串 String context = EntityUtils.toString(entity, "utf8"); System.out.println(context); } } catch (URISyntaxException | IOException e) { e.printStackTrace(); } finally { //不管如何关闭响应、请求的连接 if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } if (httpClient != null) { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 拿到的响应数据部分截图: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center 1] ### HttpPost请求 ### 同HttpGet请求一样,请求百度贴吧的地址,细看之下,POST请求和GET请求是一样地。 //HttpClient发送POST请求 public class HttpPostRequest { public static void main(String[] args) { String uri = "https://tieba.baidu.com"; //1、创建客户端,建立连接 CloseableHttpClient httpClient = HttpClients.createDefault(); //2、创建POST请求 HttpPost httpPost = new HttpPost(uri); CloseableHttpResponse response = null; try { //3、发送请求 response = httpClient.execute(httpPost); //4、获取响应数据 if (response != null && response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); String context = EntityUtils.toString(entity, "utf-8"); System.out.println(context); } } catch (IOException e) { e.printStackTrace(); } finally { //不管如何关闭响应、请求的连接 if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } if (httpClient != null) { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 返回数据部分截图: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center 2] ### HttpPost带参请求(提交表单数据) ### POST请求一般用来提交表单数据,下面就是 POST带参请求的示例,同样以和HttpGet带参请求相同的地址`乘风破浪的姐姐`为例: //由于篇幅的原因,异常不捕捉,直接抛出去了 //HttpClient发送带参POST请求 public class HttpPostRequestParam { public static void main(String[] args) throws IOException { String uri = "https://tieba.baidu.com/f"; //1、创建客户端,建立连接 CloseableHttpClient httpClient = HttpClients.createDefault(); //1.5、封装表单参数 //******************************************** List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("kw", "乘风破浪的姐姐")); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params); //2、创建HttpPost请求 HttpPost httpPost = new HttpPost(uri); //设置表单参数到请求体 httpPost.setEntity(formEntity); //******************************************** //3、发送数据 CloseableHttpResponse response = httpClient.execute(httpPost); if (response != null && response.getStatusLine().getStatusCode() == 200) { //4、获取数据 HttpEntity entity = response.getEntity(); String context = EntityUtils.toString(entity, "utf-8"); System.out.println(context); } //关闭资源 if (response != null) { response.close(); } if (httpClient != null) { httpClient.close(); } } } 获取到返回的数据: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center 3] 仔细对比之下,HttpGet请求和HttpPost请求除了**参数的封装方式不一样**之外其他的全部都是相同的。 ### HttpClient连接池+请求配置 ### httpClient连接池就类似于数据库连接池一样,从一个池子里里面获取连接。 从上面的示例可以看出,每一个代码后面都有一个`finally`代码块中的代码去关闭资源,而**频繁的创建、关闭资源对性能的影响是很大的**(就相当于每次打开浏览器,再关闭),所以在这里有了HttpClient连接池的概念。 连接池准备好HttpClient(**先打开一定数量的浏览器**)每次请求从连接池中获取一个HttpClient连接(**随便拿到一个已经打开的浏览器使用**),使用完成后HttpClient再归还到连接池中(**让别人使用**)。 下面的示例就是创建连接池以及设置请求配置的步骤,除此之外,无论是GET请求还是POST请求都无变化。 //HttpClient连接池 public class HttpClientPool { public static void main(String[] args) throws IOException { //创建HttpClient连接池:使用连接池管理器发起请求 PoolingHttpClientConnectionManager pm = new PoolingHttpClientConnectionManager(); //设置连接池最大连接数量 pm.setMaxTotal(100); //设置每个主机(访问的目标主机)的最大连接数 //每一个相同的主机最多获取10个连接数量:连接可以尽可能的达到一个数据均衡的目的 pm.setDefaultMaxPerRoute(10); //设置请求设置:部分 RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) //设置连接最长时间5000毫秒 .setConnectTimeout(500) //创建连接的最长时间:ms .setSocketTimeout(10 * 1000).build(); //设置数据传输的最长时间 //设置请求信息 doGet(pm, requestConfig); doGet(pm, requestConfig); } private static void doGet(PoolingHttpClientConnectionManager pm, RequestConfig config) throws IOException { //不每次都创建新的HttpClient,而是从连接池管理器中获取连接 CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pm).build(); //下面的部分就相同了 String uri = "https://www.baidu.com/"; HttpGet httpGet = new HttpGet(uri); //设置请求信息 httpGet.setConfig(config); // CloseableHttpResponse response = httpClient.execute(httpGet); if (response != null && response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity, "utf-8"); System.out.println(content); } //关闭响应 response.close(); //注意!这就不用关闭HttpClient了,因为连接通过连接池管理了 //httpClient.close(); } } [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center]: https://img-blog.csdnimg.cn/20200813233009268.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ==,size_16,color_FFFFFF,t_70#pic_center [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center 1]: https://img-blog.csdnimg.cn/20200813233024300.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ==,size_16,color_FFFFFF,t_70#pic_center [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center 2]: https://img-blog.csdnimg.cn/20200813233040640.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ==,size_16,color_FFFFFF,t_70#pic_center [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ_size_16_color_FFFFFF_t_70_pic_center 3]: https://img-blog.csdnimg.cn/20200813233103947.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmd6aV95dQ==,size_16,color_FFFFFF,t_70#pic_center
相关 Java HTTP客户端:使用Jakarta HttpClient创建POST请求 在Java中,我们可以使用Jakarta HttpClient库来创建HTTP POST请求。以下是一个基本的示例: 首先,你需要添加HttpClient和相关依赖到你的项目 约定不等于承诺〃/ 2024年09月10日 04:39/ 0 赞/ 15 阅读
相关 WebClient, HttpClient, OkHttp: 三个Java HTTP客户端的比较 在Java世界中,有许多用于发送HTTP请求的库。在本文中,我们将重点介绍并比较三种流行的HTTP客户端:WebClient,HttpClient和OkHttp。我们将通过讲解 谁借莪1个温暖的怀抱¢/ 2024年02月20日 08:37/ 0 赞/ 20 阅读
相关 HttpClient Java客户端 文章目录 HttpClient Java客户端 建立使用HttpClient的环境 HttpGet请求 HttpGet带参请 青旅半醒/ 2023年10月10日 11:29/ 0 赞/ 19 阅读
相关 HTTP协议客户端之HttpClient的基本使用 HttpClient的基本使用 概述 > HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 心已赠人/ 2023年09月27日 15:59/ 0 赞/ 74 阅读
相关 模拟客户端请求 Httpclients—— GET/POST 一、get,这里请求的是百度官网 import org.apache.http.HttpEntity; import org.apache.http 系统管理员/ 2022年10月26日 03:51/ 0 赞/ 183 阅读
相关 HTTP 客户端连接,选择 HttpClient 还是 OkHttp? > 开发者(KaiFaX) > > > 面向全栈工程师的开发者 > 专注于前端、Java/Python/Go/PHP的技术社区 来源:juejin.im/pos 小咪咪/ 2022年08月28日 02:58/ 0 赞/ 128 阅读
相关 HttpClient实现客户端与服务器的通信 本篇主要讲解了利用HttpClient实现 windows主机与linux服务器的通信与传递数据 HttpClient代码,服务器端配置 系统和安装软件 1)ubu 冷不防/ 2022年08月20日 13:23/ 0 赞/ 253 阅读
相关 【REST】基于RESTful服务端的客户端实现(HttpClient、RestTemplate、HttpURLConnection) 最近一直在做针对webservice的接口协议对接,总结了一下基于restful服务端的客户端的实现方式,有以下三种: [HTTPClient][] [RestTempla 刺骨的言语ヽ痛彻心扉/ 2022年06月17日 07:10/ 0 赞/ 194 阅读
相关 redis三种客户端:自带客户端、图形界面客户端、Java客户端 学习[Redis][]时为了复习方便,特将笔记截图上传。 ![Center][] ![Center 1][] 若连接不上,设置防火墙 \[root@ithe ╰+哭是因爲堅強的太久メ/ 2022年06月09日 05:58/ 0 赞/ 422 阅读
还没有评论,来说两句吧...