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

目录

  • HttpClient-快速理解&入门
    • [1. 需求](#1. 需求)
    • [2. 如何使用](#2. 如何使用)
    • [3. 具体示例](#3. 具体示例)
    • [4. 大致优点](#4. 大致优点)
    • [5. 大致缺点](#5. 大致缺点)

HttpClient-快速理解&入门

1. 需求

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

像这样:

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

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

常见的应用场景如下:

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

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

2. 如何使用

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

  1. 导入Maven坐标:

    xml 复制代码
    <dependency>
    	<groupId>org.apache.httpcomponents</groupId>
    	<artifactId>httpclient</artifactId>
    	<version>4.5.13</version>
    </dependency>
  2. 获取HttpClient对象

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

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

  5. 处理返回对象

  6. 关闭资源

3. 具体示例

  • 服务器发送Get请求:

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

    java 复制代码
    @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();
    
    
        }
  • 服务器发送Post请求:

    这里是向项目发送了一个登录请求,请求方式是Post,通过请求体携带参数(账号和密码),返回的数据是一个jwt令牌,注意这里要设置请求的编码方式和请求体的数据格式,、。

    java 复制代码
    @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();
        }

4. 大致优点

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

5. 大致缺点

  • 消耗服务器的资源。
  • HTTPClient 在发送请求时可能会暴露敏感信息,如用户名、密码等,因此在使用时需要注意安全问题。
  • 不同版本的 HTTPClient 可能会有不同的特性和行为,导致在不同环境下出现兼容性问题,需要进行额外的测试和处理。
相关推荐
kinlon.liu13 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓34 分钟前
Linux通过yum安装Docker
java·linux·docker
java66666888839 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存39 分钟前
源码分析:LinkedList
java·开发语言
执键行天涯40 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
Reese_Cool1 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言
严文文-Chris2 小时前
【设计模式-享元】
android·java·设计模式