• 【苍穹外卖】HttpClient-快速理解&入门


    HttpClient-快速理解&入门

    1. 需求

    在平常访问服务器里面的资源的时候,我们通常是通过浏览器输入网址(或者在浏览器点击某个连接)这种方式,如发出Ajax等异步请求,对于目前大多数的前后端分离项目则是通过访问浏览器到前端服务器再到后端服务器。

    像这样:

    Alt

    有没有一种使用场景,是需要服务器去发出请求的?即通过编码的方式发出请求,获取资源或者是服务?

    答案是有,而且非常多,人的精力是有限的,项目的功能也是有限的,有些功能不是开发的重点,则借助第三方的服务可以省时省力,降低开发难度。

    常见的应用场景如下:

    • 调用第三方API:当你的应用需要从外部服务获取数据时,例如,调用天气 API 获取实时天气信息,调用支付 API 进行支付操作等。
    • 与其它微服务通信:在微服务架构中,不同的服务可能分布在不同的服务器上,它们之间需要进行通信来完成业务逻辑。在服务之间发送 HTTP 请求,进行数据交换和协作。例如,一个服务可能需要从另一个服务获取用户信息或订单信息。

    HttpClient技术就实现了这样的功能,即让服务器去发出请求,获取外部资源或者是服务

    Alt

    2. 如何使用

    HttpClient技术的实现非常方便,大致步骤如下:

    1. 导入Maven坐标:

      <dependency>
      	<groupId>org.apache.httpcomponentsgroupId>
      	<artifactId>httpclientartifactId>
      	<version>4.5.13version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
    2. 获取HttpClient对象

    3. 根据请求的方式,创建对应的请求对象,如HttpGet\HttpPost

    4. 设置路径参数或者是请求体参数(如果是请求体参数,则需要这是请求的编码方式和数据格式)

    5. 处理返回对象

    6. 关闭资源

    3. 具体示例

    • 服务器发送Get请求:
      这里是请求了项目中的一个Get接口,请求成功会放回一个Integer类型的数据,即1或0

      @Test
          void testGet() throws IOException {
              //获取HttpClient对象
              CloseableHttpClient httpClient = HttpClients.createDefault();
      
              //创建请求对象
              String url = "http://localhost:8080/user/shop/status";
      
              HttpGet httpGet = new HttpGet(url);
      
              //发送请求,接受返回结果
              CloseableHttpResponse response = httpClient.execute(httpGet);
      
              //----处理返回结果
      
              //获取服务端返回的状态码
              int statusCode = response.getStatusLine().getStatusCode();
              System.out.println("服务端返回的状态码为:"+statusCode);
      
              //获取服务端返回的数据
              HttpEntity entity = response.getEntity();
      
              //对HttpEntity对象进行解析(字符串)
              String body = EntityUtils.toString(entity);
      
              System.out.println(body);
      
              //关闭资源
              response.close();
              httpClient.close();
      
      
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
    • 服务器发送Post请求:
      这里是向项目发送了一个登录请求,请求方式是Post,通过请求体携带参数(账号和密码),返回的数据是一个jwt令牌,注意这里要设置请求的编码方式和请求体的数据格式,、。

      @Test
          void testPost() throws Exception {
              //获取httpclient对象
              CloseableHttpClient httpClient = HttpClients.createDefault();
      
              //url地址
              String url = "http://localhost:8080/admin/employee/login";
      
              //获取HttpPost对象
              HttpPost httpPost = new HttpPost(url);
      
      
              //模拟请求体数据--数据格式为json
              JSONObject jsonObject = new JSONObject();
              jsonObject.put("username", "admin");
              jsonObject.put("password", "123456");
      
              //设置请求体参数对象-这里HttpEntity的实现类-StringEntity
              StringEntity stringEntity = new StringEntity(jsonObject.toJSONString());
              httpPost.setEntity(stringEntity);
      
              //设置请求编码格式
              stringEntity.setContentEncoding("utf-8");
      
              //设置请求体数据格式
              stringEntity.setContentType("application/json");
      
      
              //发送post请求
              CloseableHttpResponse response = httpClient.execute(httpPost);
      
              //获取返回数据
              int statusCode = response.getStatusLine().getStatusCode();
              System.out.println("状态响应码:" + statusCode);
      
              HttpEntity entity = response.getEntity();
              //将返回的实体类解析为字符串
              String resultData = EntityUtils.toString(entity);
              System.out.println("返回数据:" + resultData);
      
              //关闭资源
              response.close();
              httpClient.close();
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44

    4. 大致优点

    • 没有跨域问题。
    • 降低了开发难度。
    • 可以实现爬虫和网络抓取。
    • 可以发送异步请求。
    • 跨平台,多种编程语言和操作系统都可以使用。

    5. 大致缺点

    • 消耗服务器的资源。
    • HTTPClient 在发送请求时可能会暴露敏感信息,如用户名、密码等,因此在使用时需要注意安全问题。
    • 不同版本的 HTTPClient 可能会有不同的特性和行为,导致在不同环境下出现兼容性问题,需要进行额外的测试和处理。
  • 相关阅读:
    银河麒麟V10离线安装PostgreSQL10+PostGIS2.5
    Android 白天黑夜模式切换适配及引起的Activity销毁重启解决
    OpenCV简介、OpenCV的发展历程
    【Spring boot 返回 json 数据】
    [附源码]计算机毕业设计招聘系统Springboot程序
    会议剪影 | 思腾合力受邀出席第四届长三角文博会并作主题演讲
    命名路由、组件中name的作用
    商业化广告--体系学习-- 6 -- 行业蓝图篇 -- 那些产品适合采用广告模式变现
    平衡树:AVL树
    【pen200-lab】10.11.1.13
  • 原文地址:https://blog.csdn.net/m0_63834571/article/details/138088102