HttpClient Java客户端

青旅半醒 2023-10-10 11:29 118阅读 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项目的话可以导入依赖:

  1. <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
  2. <dependency>
  3. <groupId>org.apache.httpcomponents</groupId>
  4. <artifactId>httpclient</artifactId>
  5. <version>4.5.2</version>
  6. </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请求的方式向百度贴吧发送一个请求:

  1. //HttpClient发送GET请求
  2. public class HttpGetRequest {
  3. public static void main(String[] args) {
  4. //百度贴吧的uri地址
  5. String uri = "https://tieba.baidu.com/index.html";
  6. //1、创建HttpClient连接
  7. CloseableHttpClient httpClient = HttpClients.createDefault();
  8. //2、创建HtpGet请求
  9. HttpGet httpGet = new HttpGet(uri);
  10. //3、HttpClient发送请求
  11. CloseableHttpResponse response = null;
  12. try {
  13. response = httpClient.execute(httpGet);
  14. //4、拿到请求页面的返回数据,请求成功才有数据啊!
  15. HttpEntity entity = null;
  16. if (response != null && response.getStatusLine().getStatusCode() == 200) {
  17. //获取服务器返回的实体数据
  18. entity = response.getEntity();
  19. //把实体数据转换成指定类型的字符串
  20. String context = EntityUtils.toString(entity, "utf-8");
  21. System.out.println(context);
  22. }
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. //发送请求异常
  26. } finally {
  27. //不管如何关闭响应、请求的连接
  28. if (response != null) {
  29. try {
  30. response.close();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. if (httpClient != null) {
  36. try {
  37. httpClient.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. }
  44. }

返回数据的部分截图:
在这里插入图片描述

HttpGet带参请求

在返回的这部分数据中找到一个请求地址发送一个带参数的GET请求,就以请求乘风破浪的姐姐为例:

  1. //HttpClient发送带参数的GET请求
  2. public class HttpGetRequestParam {
  3. public static void main(String[] args) {
  4. //百度贴吧的uri地址
  5. String uri = "https://tieba.baidu.com/f"; // --> /f:就是二级地址:注意地址一定要正确哦!一不小心就会404
  6. //1、创建HttpClient连接
  7. CloseableHttpClient httpClient = HttpClients.createDefault();
  8. CloseableHttpResponse response = null;
  9. try {
  10. //1.5、封装GET请求的参数
  11. URIBuilder uriBuilder = new URIBuilder(uri);
  12. //第一种:setParameter放参数
  13. uriBuilder.setParameter("kw", "乘风破浪的姐姐");
  14. //uriBuilder.setParameter("kw","乘风破浪的姐姐").setParameter("t","其他参数");
  15. //第二种:放参数
  16. //List<NameValuePair> params = new ArrayList<>();
  17. //params.add(new BasicNameValuePair("kw", "乘风破浪的姐姐"));
  18. //params.add(new BasicNameValuePair("t", "其他"));
  19. //uriBuilder.setParameters(params);
  20. //第三种:放参数
  21. //uriBuilder.setParameters(new BasicNameValuePair("kw", "乘风破浪的姐姐"),
  22. // new BasicNameValuePair("t", "其他参数"));
  23. //2、创建HtpGet请求:uriBuilder.build()
  24. HttpGet httpGet = new HttpGet(uriBuilder.build());
  25. //3、HttpClient发送请求
  26. response = httpClient.execute(httpGet);
  27. //4、拿到请求页面的返回数据,请求成功才有数据啊!
  28. HttpEntity entity = null;
  29. if (response != null && response.getStatusLine().getStatusCode() == 200) {
  30. //获取服务器返回的实体数据
  31. entity = response.getEntity();
  32. //把实体数据转换成指定类型的字符串
  33. String context = EntityUtils.toString(entity, "utf8");
  34. System.out.println(context);
  35. }
  36. } catch (URISyntaxException | IOException e) {
  37. e.printStackTrace();
  38. } finally {
  39. //不管如何关闭响应、请求的连接
  40. if (response != null) {
  41. try {
  42. response.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. if (httpClient != null) {
  48. try {
  49. httpClient.close();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }
  56. }

拿到的响应数据部分截图:

在这里插入图片描述

HttpPost请求

同HttpGet请求一样,请求百度贴吧的地址,细看之下,POST请求和GET请求是一样地。

  1. //HttpClient发送POST请求
  2. public class HttpPostRequest {
  3. public static void main(String[] args) {
  4. String uri = "https://tieba.baidu.com";
  5. //1、创建客户端,建立连接
  6. CloseableHttpClient httpClient = HttpClients.createDefault();
  7. //2、创建POST请求
  8. HttpPost httpPost = new HttpPost(uri);
  9. CloseableHttpResponse response = null;
  10. try {
  11. //3、发送请求
  12. response = httpClient.execute(httpPost);
  13. //4、获取响应数据
  14. if (response != null && response.getStatusLine().getStatusCode() == 200) {
  15. HttpEntity entity = response.getEntity();
  16. String context = EntityUtils.toString(entity, "utf-8");
  17. System.out.println(context);
  18. }
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. } finally {
  22. //不管如何关闭响应、请求的连接
  23. if (response != null) {
  24. try {
  25. response.close();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. if (httpClient != null) {
  31. try {
  32. httpClient.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. }
  39. }

返回数据部分截图:
在这里插入图片描述

HttpPost带参请求(提交表单数据)

POST请求一般用来提交表单数据,下面就是 POST带参请求的示例,同样以和HttpGet带参请求相同的地址乘风破浪的姐姐为例:

  1. //由于篇幅的原因,异常不捕捉,直接抛出去了
  2. //HttpClient发送带参POST请求
  3. public class HttpPostRequestParam {
  4. public static void main(String[] args) throws IOException {
  5. String uri = "https://tieba.baidu.com/f";
  6. //1、创建客户端,建立连接
  7. CloseableHttpClient httpClient = HttpClients.createDefault();
  8. //1.5、封装表单参数
  9. //********************************************
  10. List<NameValuePair> params = new ArrayList<>();
  11. params.add(new BasicNameValuePair("kw", "乘风破浪的姐姐"));
  12. UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params);
  13. //2、创建HttpPost请求
  14. HttpPost httpPost = new HttpPost(uri);
  15. //设置表单参数到请求体
  16. httpPost.setEntity(formEntity);
  17. //********************************************
  18. //3、发送数据
  19. CloseableHttpResponse response = httpClient.execute(httpPost);
  20. if (response != null && response.getStatusLine().getStatusCode() == 200) {
  21. //4、获取数据
  22. HttpEntity entity = response.getEntity();
  23. String context = EntityUtils.toString(entity, "utf-8");
  24. System.out.println(context);
  25. }
  26. //关闭资源
  27. if (response != null) {
  28. response.close();
  29. }
  30. if (httpClient != null) {
  31. httpClient.close();
  32. }
  33. }
  34. }

获取到返回的数据:

在这里插入图片描述

仔细对比之下,HttpGet请求和HttpPost请求除了参数的封装方式不一样之外其他的全部都是相同的。

HttpClient连接池+请求配置

httpClient连接池就类似于数据库连接池一样,从一个池子里里面获取连接。
从上面的示例可以看出,每一个代码后面都有一个finally代码块中的代码去关闭资源,而频繁的创建、关闭资源对性能的影响是很大的(就相当于每次打开浏览器,再关闭),所以在这里有了HttpClient连接池的概念。

连接池准备好HttpClient(先打开一定数量的浏览器)每次请求从连接池中获取一个HttpClient连接(随便拿到一个已经打开的浏览器使用),使用完成后HttpClient再归还到连接池中(让别人使用)。

下面的示例就是创建连接池以及设置请求配置的步骤,除此之外,无论是GET请求还是POST请求都无变化。

  1. //HttpClient连接池
  2. public class HttpClientPool {
  3. public static void main(String[] args) throws IOException {
  4. //创建HttpClient连接池:使用连接池管理器发起请求
  5. PoolingHttpClientConnectionManager pm = new PoolingHttpClientConnectionManager();
  6. //设置连接池最大连接数量
  7. pm.setMaxTotal(100);
  8. //设置每个主机(访问的目标主机)的最大连接数
  9. //每一个相同的主机最多获取10个连接数量:连接可以尽可能的达到一个数据均衡的目的
  10. pm.setDefaultMaxPerRoute(10);
  11. //设置请求设置:部分
  12. RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) //设置连接最长时间5000毫秒
  13. .setConnectTimeout(500) //创建连接的最长时间:ms
  14. .setSocketTimeout(10 * 1000).build(); //设置数据传输的最长时间
  15. //设置请求信息
  16. doGet(pm, requestConfig);
  17. doGet(pm, requestConfig);
  18. }
  19. private static void doGet(PoolingHttpClientConnectionManager pm, RequestConfig config) throws IOException {
  20. //不每次都创建新的HttpClient,而是从连接池管理器中获取连接
  21. CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pm).build();
  22. //下面的部分就相同了
  23. String uri = "https://www.baidu.com/";
  24. HttpGet httpGet = new HttpGet(uri);
  25. //设置请求信息
  26. httpGet.setConfig(config);
  27. //
  28. CloseableHttpResponse response = httpClient.execute(httpGet);
  29. if (response != null && response.getStatusLine().getStatusCode() == 200) {
  30. HttpEntity entity = response.getEntity();
  31. String content = EntityUtils.toString(entity, "utf-8");
  32. System.out.println(content);
  33. }
  34. //关闭响应
  35. response.close();
  36. //注意!这就不用关闭HttpClient了,因为连接通过连接池管理了
  37. //httpClient.close();
  38. }
  39. }

发表评论

表情:
评论列表 (有 0 条评论,118人围观)

还没有评论,来说两句吧...

相关阅读