支持HTTP协议的客户端工具包HttpClient的应用详解

红太狼 2023-05-29 06:45 53阅读 0赞

目录

概 述:

HttpClient 的应用详解:

一、HttpClient 概述

二、HttpClient 主要功能

三、HttpClient 主要特性

四、HttpClient 常见状态码

五、HttpClient 一般使用步骤

六、HttpClient 使用示例

七、HttpClient 示例源代码地址【GitHub】

八、HttpClientUtils 工具类封装【HttpClient的实际应用】

九、参考文献


概 述:

在系统研发过程中,系统架构分为服务端、PC端、移动端、IOS端等其它端(业务场景比较复杂),在数据交互的中使用到了HttpClient,比如我们的移动端通过HttpClient到服务端的这样一个数据交互模式,当然还涉及了一些高可用等,就不在这儿讲了,那么,本篇博文主要是针对HttpClient的一些介绍及实际应用示例。

HttpClient 的应用详解:

一、HttpClient 概述

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本。

HttpClient 通过 http 协议来访问网络资源,它可以提供有效的、最新的、功能丰富 http 客户端。为了更好的拓展,HttpClient 即支持基本的 http 协议,还支持了 http-aware 客户端程序,如 web 浏览器,Webservice 客户端,以及利用或者拓展 http 协议的分布式系统等。

二、HttpClient 主要功能

1)、实现了所有 HTTP 的方法,包括常用的有:GET、POST、PUT、PATCH、DELETE等);

2)、支持自动转发;

3)、支持 HTTPS 协议;

4)、支持代理服务器;

三、HttpClient 主要特性

1)、HttpClient 是一个基于 HttpCore 的客户端 Http 传输类库;
2)、基于传统的 IO;
3)、与内容无关的;

四、HttpClient 常见状态码




















































200 OK

请求已成功,请求所希望的响应头或数据体将随此响应返回;

201 Created

请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回;

202 Accepted

服务器已接受请求,但尚未处理;

400 Bad Request

语义有误,当前请求无法被服务器理解;

请求参数有误;

403 Forbidden

服务器已经理解请求,但是拒绝执行它;

404 Not Found

请求失败,请求所希望得到的资源未被在服务器上发现;

405 Method Not Allowed

请求行中指定的请求方法不能被用于请求相应的资源;

415 Unsupported Media Type

对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝;

500 Internal Server Error

服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理;

501 Not Implemented

服务器不支持当前请求所需要的某个功能;

502 Bad Gateway

作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应;

503 Service Unavailable

由于临时的服务器维护或者过载,服务器当前无法处理请求;

HTTP状态码:【HTTP状态码详解,这个比较全的】

五、HttpClient 一般使用步骤

1)、创建 HttpClient 对象;

2)、创建请求方法的实例,并指定请求URL。例如:需要发送 GET 请求,创建 HttpGet 对象;如果需要发送 POST 请求,创建HttpPost 对象等;

3)、配置请求参数。例如:需要发送 GET 请求,可调用 HttpGet 的 setParams() 方法添加参数并通过 URIBuilder 对象的 setParameter 方法来构建请求参数;如果需要发送 POST 请求,则调用 setEntity(HttpEntity entity) 方法来设置请求参数;

4)、通过调用 HttpClient 对象的 execute(final HttpUriRequest request) 发送请求,该方法返回一个 HttpResponse 对象;

5)、通过调用 HttpResponse 的 getStatusLine() 方法的 getStatusCode() 获取响应状态码;调用 HttpResponse 的 getAllHeaders()、getHeaders(String name) 方法可获取消息的响应头;调用 HttpResponse 的 getEntity() 方法可获取 HttpEntity对象,该对象包装了服务器的响应内容,程序可通过该对象获取服务器的响应内容,并通过 EntityUtils 对象的 toString(HttpEntity entity, String defaultCharset) 来转换响应内容的字符集;

6)、释放资源,关闭连接。无论请求是否执行成功,都必须释放连接,避免出现资源异常占用、挂起等现象;

六、HttpClient 使用示例

doGet无参示例:

  1. package com.huazai.httpclient.get;
  2. import org.apache.http.client.methods.CloseableHttpResponse;
  3. import org.apache.http.client.methods.HttpGet;
  4. import org.apache.http.impl.client.CloseableHttpClient;
  5. import org.apache.http.impl.client.HttpClients;
  6. import org.apache.http.util.EntityUtils;
  7. /**
  8. *
  9. * @author HuaZai
  10. * @contact who.seek.me@java98k.vip
  11. * <ul>
  12. * @description 测试不带参数的GET请求
  13. * </ul>
  14. * @className DoGET
  15. * @package com.huazai.httpclient.get
  16. * @createdTime 2017年06月17日
  17. *
  18. * @version V1.0.0
  19. */
  20. public class DoGET
  21. {
  22. public static void main(String[] args) throws Exception
  23. {
  24. // 创建HttpClient对象
  25. CloseableHttpClient httpclient = HttpClients.createDefault();
  26. // 创建HttpGet请求对象
  27. HttpGet httpGet = new HttpGet("https://xiaoyuan.zhaopin.com/api/sou?pageNumber=2");
  28. CloseableHttpResponse response = null;
  29. try
  30. {
  31. // 执行请求
  32. response = httpclient.execute(httpGet);
  33. // 是否请求成功
  34. if (response.getStatusLine().getStatusCode() == 200)
  35. {
  36. // 输出响应内容
  37. String content = EntityUtils.toString(response.getEntity(), "UTF-8");
  38. System.out.println("内容长度:" + content.length());
  39. System.out.println(content);
  40. }
  41. } finally
  42. {
  43. if (response != null)
  44. {
  45. response.close();
  46. }
  47. httpclient.close();
  48. }
  49. }
  50. }

doGet有参示例:

  1. package com.huazai.httpclient.get;
  2. import java.net.URI;
  3. import org.apache.http.client.methods.CloseableHttpResponse;
  4. import org.apache.http.client.methods.HttpGet;
  5. import org.apache.http.client.utils.URIBuilder;
  6. import org.apache.http.impl.client.CloseableHttpClient;
  7. import org.apache.http.impl.client.HttpClients;
  8. import org.apache.http.util.EntityUtils;
  9. /**
  10. *
  11. * @author HuaZai
  12. * @contact who.seek.me@java98k.vip
  13. * <ul>
  14. * @description 测试带参数的GET请求
  15. * </ul>
  16. * @className DoGETParam
  17. * @package com.huazai.httpclient.get
  18. * @createdTime 2017年06月17日
  19. *
  20. * @version V1.0.0
  21. */
  22. public class DoGETWithParam
  23. {
  24. public static void main(String[] args) throws Exception
  25. {
  26. // 创建Httpclient对象
  27. CloseableHttpClient httpclient = HttpClients.createDefault();
  28. // 定义请求的地址及参数
  29. URI uri = new URIBuilder("https://xiaoyuan.zhaopin.com/api/sou").setParameter("pageNumber", "1")
  30. .setParameter("keyWord", "java").build();
  31. System.out.println(uri);
  32. // 创建HttpGet请求对象
  33. HttpGet httpGet = new HttpGet(uri);
  34. CloseableHttpResponse response = null;
  35. try
  36. {
  37. // 执行请求
  38. response = httpclient.execute(httpGet);
  39. // 是否请求成功
  40. if (response.getStatusLine().getStatusCode() == 200)
  41. {
  42. // 输出响应内容
  43. String content = EntityUtils.toString(response.getEntity(), "UTF-8");
  44. System.out.println(content);
  45. }
  46. } finally
  47. {
  48. if (response != null)
  49. {
  50. response.close();
  51. }
  52. httpclient.close();
  53. }
  54. }
  55. }

doPost无参示例:

  1. package com.huazai.httpclient.post;
  2. import org.apache.http.client.methods.CloseableHttpResponse;
  3. import org.apache.http.client.methods.HttpPost;
  4. import org.apache.http.impl.client.CloseableHttpClient;
  5. import org.apache.http.impl.client.HttpClients;
  6. import org.apache.http.util.EntityUtils;
  7. /**
  8. *
  9. * @author HuaZai
  10. * @contact who.seek.me@java98k.vip
  11. * <ul>
  12. * @description 测试不带参数的Post请求
  13. * </ul>
  14. * @className DoPOST
  15. * @package com.huazai.httpclient.post
  16. * @createdTime 2017年06月17日
  17. *
  18. * @version V1.0.0
  19. */
  20. public class DoPOST
  21. {
  22. public static void main(String[] args) throws Exception
  23. {
  24. // 创建HttpClient对象
  25. CloseableHttpClient httpclient = HttpClients.createDefault();
  26. // 创建HttpPost请求对象
  27. HttpPost httpPost = new HttpPost("http://www.oschina.net/");
  28. // 设置请求头
  29. httpPost.setHeader("User-Agent",
  30. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36");
  31. CloseableHttpResponse response = null;
  32. try
  33. {
  34. // 执行请求
  35. response = httpclient.execute(httpPost);
  36. // 是否请求成功
  37. if (response.getStatusLine().getStatusCode() == 200)
  38. {
  39. // 输出请求内容
  40. String content = EntityUtils.toString(response.getEntity(), "UTF-8");
  41. System.out.println(content);
  42. }
  43. } finally
  44. {
  45. if (response != null)
  46. {
  47. response.close();
  48. }
  49. httpclient.close();
  50. }
  51. }
  52. }

doPost有参示例:

  1. package com.huazai.httpclient.post;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.http.NameValuePair;
  5. import org.apache.http.client.entity.UrlEncodedFormEntity;
  6. import org.apache.http.client.methods.CloseableHttpResponse;
  7. import org.apache.http.client.methods.HttpPost;
  8. import org.apache.http.impl.client.CloseableHttpClient;
  9. import org.apache.http.impl.client.HttpClients;
  10. import org.apache.http.message.BasicNameValuePair;
  11. import org.apache.http.util.EntityUtils;
  12. /**
  13. *
  14. * @author HuaZai
  15. * @contact who.seek.me@java98k.vip
  16. * <ul>
  17. * @description 测试带参数的POST请求
  18. * </ul>
  19. * @className DoPOSTParam
  20. * @package com.huazai.httpclient.post
  21. * @createdTime 2017年06月17日
  22. *
  23. * @version V1.0.0
  24. */
  25. public class DoPOSTWithParam
  26. {
  27. public static void main(String[] args) throws Exception
  28. {
  29. // 创建HttpClient对象
  30. CloseableHttpClient httpclient = HttpClients.createDefault();
  31. // 创建HttpPost请求对象
  32. HttpPost httpPost = new HttpPost("http://39.106.243.121/eto/add");
  33. // 封装请求参数列表
  34. List<NameValuePair> pairs = new ArrayList<NameValuePair>(0);
  35. pairs.add(new BasicNameValuePair("CityId", "530"));
  36. pairs.add(new BasicNameValuePair("CityName", "北京"));
  37. pairs.add(new BasicNameValuePair("SubCompanyNumber", "CC000773458D90000002000"));
  38. pairs.add(new BasicNameValuePair("CompanyName", "Oracle"));
  39. pairs.add(new BasicNameValuePair("CompanyTypeId", "5"));
  40. pairs.add(new BasicNameValuePair("IndustryName", "软件"));
  41. pairs.add(new BasicNameValuePair("CompanySize", "10000人以上"));
  42. pairs.add(new BasicNameValuePair("CompanyNumber", "DC000773458"));
  43. // 构造一个Form表单
  44. UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(pairs);
  45. // 设置请求体
  46. httpPost.setEntity(formEntity);
  47. CloseableHttpResponse response = null;
  48. try
  49. {
  50. // 执行请求
  51. response = httpclient.execute(httpPost);
  52. // 是否请求成功
  53. if (response.getStatusLine().getStatusCode() == 200)
  54. {
  55. // 输出请求内容
  56. String content = EntityUtils.toString(response.getEntity(), "UTF-8");
  57. System.out.println(content);
  58. }
  59. } finally
  60. {
  61. if (response != null)
  62. {
  63. response.close();
  64. }
  65. httpclient.close();
  66. }
  67. }
  68. }

七、HttpClient 示例源代码地址【GitHub】

依赖的父级项目:huazai-parent

HttpClient 示例项目:huazai-httpclient

如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hlbGxvX1dvcmxkX1FXUA_size_16_color_FFFFFF_t_70

八、HttpClientUtils 工具类封装【HttpClient的实际应用】

【 HttpClientUtils工具类封装 】

九、参考文献

【HTTPCLIENT_APACHE官网】

【HTTPCLIENT_百度百科】


好了,关于 支持HTTP协议的客户端工具包HttpClient的应用详解 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。

























作       者: 华    仔
联系作者: who.seek.me@java98k.vip
来        源: CSDN (Chinese Software Developer Network)
原        文: https://blog.csdn.net/Hello_World_QWP/article/details/102912684
版权声明: 本文为博主原创文章,请在转载时务必注明博文出处!

发表评论

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

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

相关阅读