使用Spring Boot和Apache HttpClient构建REST客户端

这篇具有很好参考价值的文章主要介绍了使用Spring Boot和Apache HttpClient构建REST客户端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Spring Boot和Apache HttpClient构建REST客户端

介绍:
在本文中,我们将学习如何使用Spring Boot和Apache HttpClient创建一个REST客户端。我们将探讨如何与远程服务器进行通信、处理JSON响应,并为Web应用程序配置跨源资源共享(CORS)。让我们深入代码吧!


服务层

ClientService 类负责发起HTTP请求并处理响应。它使用 @Service 注解表示它应该由Spring容器进行管理。

@Service
public class ClientService {
    @Autowired
    private CloseableHttpClient httpClient;
    @Autowired
    private ObjectMapper objectMapper;
    
    // 发起GET请求并将响应作为Map返回的方法
    public Map ResponseMap(String url) throws IOException {
        // 创建GET请求,并使用提供的URL
        HttpGet request = new HttpGet(url);

        // 发送请求并获取响应
        HttpResponse response = httpClient.execute(request);
        HttpEntity entity = response.getEntity();

        // 处理响应体
        Map responseBody = null;
        if (entity != null) {
            String jsonString = EntityUtils.toString(entity);
            responseBody = objectMapper.readValue(jsonString, Map.class);
        }

        // 关闭连接
        EntityUtils.consume(entity);

        return responseBody;
    }

    // 发起GET请求并将响应作为String返回的方法
    public String ResponString(String url) throws IOException {
        // 创建GET请求,并使用提供的URL
        HttpGet request = new HttpGet(url);

        // 发送请求并获取响应
        HttpResponse response = httpClient.execute(request);
        HttpEntity entity = response.getEntity();

        // 处理响应体
        String responseBody = "";
        if (entity != null) {
            responseBody = EntityUtils.toString(entity);
        }

        // 关闭连接
        EntityUtils.consume(entity);

        return responseBody;
    }
}

控制器层

MyClientController 类是控制器层,负责处理HTTP请求并返回响应。

@RestController
@RequestMapping("/api")
public class MyClientController {
    private final ObjectMapper objectMapper;
    private final CloseableHttpClient httpClient;
    private final ClientService clientService;

    @Autowired
    public MyClientController(CloseableHttpClient httpClient, ObjectMapper objectMapper, ClientService clientService) {
        this.httpClient = httpClient;
        this.objectMapper = objectMapper;
        this.clientService = clientService;
    }

    @GetMapping("/example")
    public ResponseEntity<String> ResponString() throws IOException {
        String s = clientService.ResponString("http://localhost:8081/api/test");
        return ResponseEntity.ok(s);
    }

    @GetMapping("/mapreq")
    public ResponseEntity<Map> ResponseMap() throws IOException {
        Map map1 = clientService.ResponseMap("http://localhost:8081/flux/testmap");
        System.out.println("map1 = " + map1);
        Object key1 = map1.get("key1");
        System.out.println("key1.toString() = " + key1.toString());
        return ResponseEntity.ok(map1);
    }

    @GetMapping("/test")
    public String testEndpoint() {
        return "test";
    }
}

配置类

HttpClientConfiguration 类是一个配置类,用于自动装配到Bean中。

@Configuration
public class HttpClientConfiguration {

    @Bean
    public CloseableHttpClient httpClient() {
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();

        // 设置请求头
        httpClientBuilder.setDefaultHeaders(Arrays.asList(createDefaultHeaders()));

        // 设置基础配置
        httpClientBuilder.setDefaultRequestConfig(createRequestConfig());

        // 创建HttpClient对象
        CloseableHttpClient httpClient = httpClientBuilder.build();
        return httpClient;
    }

    private RequestConfig createRequestConfig() {
        // 设置连接超时时间
        int connectionTimeout = 5000;
        // 设置读取超时时间
        int socketTimeout = 5000;

        return RequestConfig.custom()
                .setConnectTimeout(connectionTimeout)
                .setSocketTimeout(socketTimeout)
                .build();
    }

    private Header[] createDefaultHeaders() {
        Header[] headers = {
                new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/json"),
                // 可以添加其他请求头
        };
        return headers;
    }
}

跨域配置

MyCorsConfiguration 类是一个配置类,用于配置WebFlux的跨域。

@Configuration
public class MyCorsConfiguration extends org.springframework.web.cors.CorsConfiguration {

    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration corsConfig = new CorsConfiguration();
        corsConfig.addAllowedOrigin("*");
        corsConfig.addAllowedMethod("*");
        corsConfig.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfig);

        return new CorsWebFilter(source);
    }
}

在本示例中,我们创建了一个包含服务层、控制器层和配置类的Spring Boot应用程序。服务层的 ClientService 类负责通过Apache HttpClient发起HTTP请求,并处理响应。控制器层的 MyClientController 类负责处理HTTP请求并返回响应。我们还创建了一个配置类 HttpClientConfiguration,用于配置Apache HttpClient,并将其作为Bean注入到应用程序中。另外,我们还创建了一个配置类 MyCorsConfiguration,用于配置WebFlux的跨域资源共享(CORS)。

Spring Boot和Apache HttpClient构建REST客户端的应用。

  1. 错误处理:在实际应用中,处理HTTP请求和响应中的错误非常重要。您可以在ClientService类中添加适当的错误处理机制,例如处理连接超时、读取超时、状态码错误等。这样可以提高应用程序的健壮性和容错性。

  2. 请求参数和请求体:在实际场景中,您可能需要向服务器发送具有请求参数或请求体的HTTP请求。您可以使用HttpClient的不同方法(例如HttpPost)来发送包含请求参数或请求体的POST请求。在ClientService类中添加相应的方法来处理这些类型的请求。

  3. 身份验证和授权:如果您需要对HTTP请求进行身份验证或授权,您可以使用Apache HttpClient提供的功能来处理这些方面。例如,您可以设置请求头中的身份验证凭据,或者使用OAuth等授权机制来访问受限资源。

  4. 并发请求:在某些情况下,您可能需要同时发起多个HTTP请求,并在所有请求完成后进行处理。您可以使用Apache HttpClient的异步功能或结合Spring Boot的异步支持来实现并发请求。

  5. 单元测试:编写单元测试对于确保REST客户端的正确性和稳定性非常重要。您可以使用Spring Boot提供的测试框架(如JUnit和MockMvc)来编写单元测试,并模拟HTTP请求和响应。

  6. 日志记录:在开发和调试过程中,记录HTTP请求和响应的详细信息非常有用。您可以使用适当的日志记录框架(如Logback或Log4j)来记录HTTP请求和响应的信息,以便进行故障排除和性能优化。文章来源地址https://www.toymoban.com/news/detail-793592.html

到了这里,关于使用Spring Boot和Apache HttpClient构建REST客户端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java使用Milo实现OPC UA客户端,封装spring boot starter

    最新版本更新日志查看:https://github.com/kangaroo1122/milo-spring-boot-starter/blob/main/UPDATE.md、https://gitee.com/vampire001/milo-spring-boot-starter/blob/master/UPDATE.md,此处不再更新 由eclipse开源,地址:https://github.com/eclipse/milo,可以基于此开发OPC UA客户端或者服务端。 本文介绍基于milo 封装的sp

    2024年02月09日
    浏览(49)
  • spring data elasticsearch使用7.x客户端兼容es 8.x和使用ssl构建RestHighLevelClient

    es在7.x中默认加入elastic security组件所以java client需要使用ssl连接es server. es 8.x 中废弃了 RestHighLevelClient ,使用新版的 java api client ,但是spring data elasticsearch还未更新到该版本.所以需要兼容es 8.x 如下是RestHighLevelClient构建方法: spring data elasticsearch客户端依赖(基于spring boot2.7使用最新

    2024年02月13日
    浏览(53)
  • Spring Boot Starter Data Redis使用Lettuce客户端报错:NOAUTH Authentication required

    Spring Boot版本升级为:2.6.14 redis依赖: redis配置不变,还是带password的: 项目启动后,获取redis连接时,报错:NOAUTH Authentication required spring-boot-starer-data-redis支持使用Jedis和Lettuce作为redis客户端,如果配置不指定则默认使用Lettuce。 不管是Lettuce还是还是Jedis,核心是构建RedisCo

    2024年01月25日
    浏览(49)
  • 利用Spring Boot实现客户端IP地理位置获取

    在当今互联的世界中,了解客户端的地理位置对于提供个性化服务和增强用户体验至关重要。无论是根据地区偏好定制内容,还是确保符合本地法规,访问客户端IP位置都是一项宝贵的资产。如抖音评论区、用户页都会展示用户的IP属地信息。 在本文中,我们将探讨一个Spri

    2024年02月20日
    浏览(62)
  • Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

          假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的资源是否有更新。                         在长时间不更新

    2024年02月16日
    浏览(60)
  • 在Spring Boot微服务集成Kafka客户端(spring-kafka)操作Kafka

    记录 :457 场景 :在Spring Boot微服务集成Kafka客户端spring-kafka-2.8.2操作Kafka。使用Spring封装的KafkaTemplate操作Kafka生产者Producer。使用Spring封装的@KafkaListener操作Kafka的消费者Consumer。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,spring-kafka-2.8.2。 Kafka安装 :https://blog.csdn.net/zhangbeizhen1

    2024年02月09日
    浏览(61)
  • 基于Spring Boot2.0 & HTTP/2 实现服务器、客户端

    HTTP协议由于其无状态的特性以及超高的普及率,是当下大部分网站选择使用的应用层协议。然而,HTTP/1.x的底层传输方式的几个特性,已经对应用的整体性能产生了负面影响。特别是,HTTP/1.0在每次的TCP连接上只允许发送一次请求,在HTTP/1.1中增加了请求管线,但是这仅仅解决

    2023年04月09日
    浏览(68)
  • 【Spring Boot Admin】客户端服务无法注册到监控平台的相关问题及解决方案

    1、客户端服务整合了Spring Security 通过URL注册,需在客户端服务中添加如下配置 通过注册中心注册,需在客户端服务中添加如下配置 2、客户端服务配置了server.port.context-path参数,并且客户端服务通过注册中心注册 需在客户端服务中添加如下配置 3、Spring Boot Admin 监控平台使

    2024年02月16日
    浏览(59)
  • 在Spring Boot微服务集成Kafka客户端(kafka-clients)操作Kafka

    记录 :459 场景 :在Spring Boot微服务集成Kafka客户端kafka-clients-3.0.0操作Kafka。使用kafka-clients的原生KafkaProducer操作Kafka生产者Producer。使用kafka-clients的原生KafkaConsumer操作Kafka的消费者Consumer。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,kafka-clients-3.0.0。 Kafka安装 :https://blog.csdn.ne

    2024年02月12日
    浏览(52)
  • Kafka增加安全验证安全认证,SASL认证,并通过spring boot-Java客户端连接配置

    公司Kafka一直没做安全验证,由于是诱捕程序故需要面向外网连接,需要增加Kafka连接验证,保证Kafka不被非法连接,故开始研究Kafka安全验证 使用Kafka版本为2.4.0版本,主要参考官方文档 官网对2.4版本安全验证介绍以及使用方式地址: https://kafka.apache.org/24/documentation.html#secu

    2024年02月01日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包