Spring REST API 客户端风格:从 RestTemplate 到 RestClient

主要观点:

  • 应用需交换数据以协作,如今的应用处于类似人类交流的情境,文中主要分析客户端与服务器通过 REST 的同步通信及 Spring REST API 客户端的实现。
  • 介绍了RestTemplate(Spring Framework 3.0 引入)、WebClient(Spring Framework 5.0 引入)和RestClient(Spring Framework 6.1 和 Spring Boot 3.2 引入)这三种用于同步 HTTP 访问的组件,开发者可根据应用需求选择。
  • 通过figure-service(服务器)和figure-client(客户端)的示例,展示了使用RestTemplateRestClient实现同步通信的过程,包括接口定义、认证、数据传输对象(DTO)、异常处理、日志记录和配置等方面。

关键信息:

  • RestTemplate是同步客户端,灵活且高度可配置,长期是 Spring 应用中同步阻塞 HTTP 客户端的最佳选择,但缺乏非阻塞能力等。
  • WebClient专为WebFlux栈设计,遵循现代函数式 API 风格,更易使用,但对于阻塞场景有额外成本。
  • RestClient提供更现代的 API,可用于同步 HTTP 访问,在新的应用中可替代RestTemplate
  • figure-service暴露 REST API 管理Figure实体,存储在内存 H2 数据库中,所有服务器异常以特定形式处理。
  • figure-client通过FigureClient接口与figure-service通信,在实现中考虑了合同、认证、DTO、异常处理等,可使用RestTemplateRestClient,并可通过LoggingInterceptor记录请求和响应。

重要细节:

  • AuthInterceptor通过环境变量获取 API 密钥并添加到请求头进行认证。
  • CustomResponseErrorHandler用于处理响应错误,区分客户端和服务器错误并返回自定义异常。
  • LoggingInterceptor可记录请求和响应体,但要注意读取响应体后流被消耗的问题,可使用BufferingClientHttpRequestFactory解决。
  • RestTemplate的配置通过RestTemplateBuilder添加拦截器和错误处理程序。
  • 在测试中,通过CommandLineRunnerfigure-service数据库中插入数据,然后使用FigureClientTest测试figure-client的各种操作。
  • RestClient的配置类似RestTemplate,可重用部分拦截器和错误处理程序,通过注入RestClient实例实现客户端功能。

资源:

  1. RestTemplateSpring Framework API Reference
  2. WebClientSpring Framework API Reference
  3. RestClientSpring Framework API Reference
  4. Migrating from RestTemplate to RestClient
  5. figure-service source code
  6. figure-client source code
  7. 图片拍摄于罗马尼亚布加勒斯特。
阅读 22
0 条评论