当前位置: 首页 > news >正文

RestTemplate远程请求的艺术

1 简说

编程是一门艺术,追求优雅的代码就像追求优美的音乐。

很多有多年工作经验的开发者,在使用RestTemplate之前常常使用HttpClient,然而接触了RestTemplate之后,却愿意放弃多年相处的“老朋友”,转向RestTemplate。那么一定是RestTemplate有它的魅力,有它的艺术风范。

2 优势

RestTemplate是Spring框架提供的用于进行HTTP请求的模板类,具有以下优点:

  1. 简单易用:RestTemplate提供了简洁的API,使得发送HTTP请求变得简单和直观。

  2. 集成性强:作为Spring框架的一部分,RestTemplate与Spring的其他组件(如Spring Boot)集成良好,可以方便地与其他Spring功能和第三方库一起使用。

  3. 丰富的功能:RestTemplate支持多种HTTP方法(GET、POST、PUT、DELETE等),并提供了丰富的功能,如请求参数设置、请求头定制、响应处理等。

  4. 拓展性强:通过使用RestTemplate的拦截器(Interceptor)和消息转换器(MessageConverter),可以对请求和响应进行灵活的处理和定制,满足各种需求。

  5. RESTful支持:RestTemplate设计用于处理RESTful风格的服务,支持处理JSON、XML等不同类型的数据格式。

  6. 模板化的设计:RestTemplate使用模板方法设计模式,将通用的HTTP请求逻辑抽象出来,使得开发者可以专注于业务逻辑而不必关心底层HTTP通信细节。

  7. 广泛应用:由于Spring框架的流行和广泛应用,RestTemplate也被广泛使用,有大量的社区支持和相关文档资源可供参考。

3 实战

3.1 无需编写关闭连接

“简单就是美。” - 罗伯特·布朗尼ング(Robert Browning)

如下HttpClient编写后,需要关闭连接,释放资源,如下:
在这里插入图片描述
RestTemplate 不需要编写关闭,如下:

RestTemplate restTemplate = new RestTemplate();
String fooResourceUrl= "http://localhost:8080/spring-rest/foos";
ResponseEntity<String> response= restTemplate.getForEntity(fooResourceUrl + "/1", String.class);

3.2 可以完全访问Http响应

可以通过json api对响应结果进行操作处理:

ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(response.getBody());
JsonNode name = root.path("name");
Assertions.assertNotNull(name.asText());

3.3 结果可以转模型

可以把返回结果,转换为java模型对象:

RestTemplate restTemplate = new RestTemplate();HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);
Assertions.assertNotNull(foo);
Assertions.assertEquals(foo.getName(), "bar");

注意 postForObject ,getForEntity 前一个直接返回了对象,没有状态码等信息,后一个包含状态码和返回的资源内容。

3.4 灵活

相关文章:

  • echarts写某个市地图
  • 如何进行LLM大模型推理优化
  • [大模型]Qwen2-7B-Instruct 接入 LangChain 搭建知识库助手
  • CSS实现经典打字小游戏《生死时速》
  • 【Windows】配置Flutter开发环境
  • ArrayList和LinkedList的区别!!!
  • 文献学习——PWM - PFM模式无缝转换的PFC变换器统一控制
  • LVS工作模式详解,NAT全方位剖析
  • PromptMRG: Diagnosis-Driven Prompts for Medical Report Generation
  • 还在用Flex布局?OUT了 快来看看grid布局吧!
  • 计算机二级Access选择题考点—代码篇
  • Java程序设计 第五章 循环
  • 微信小程序毕业设计-智慧消防系统项目开发实战(附源码+论文)
  • 今日成果2024-6-7 TrustZone TEE安全SDK开发指南
  • MySQL 保姆级教程(四):过滤数据
  • 2017前端实习生面试总结
  • 4. 路由到控制器 - Laravel从零开始教程
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Gradle 5.0 正式版发布
  • leetcode98. Validate Binary Search Tree
  • scala基础语法(二)
  • vue--为什么data属性必须是一个函数
  • windows-nginx-https-本地配置
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 中文输入法与React文本输入框的问题与解决方案
  • Java性能优化之JVM GC(垃圾回收机制)
  • Mac 上flink的安装与启动
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​MySQL主从复制一致性检测
  • # 达梦数据库知识点
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $.ajax()方法详解
  • %@ page import=%的用法
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)认识微服务
  • (一一四)第九章编程练习
  • (转)Scala的“=”符号简介
  • (转载)利用webkit抓取动态网页和链接
  • .htaccess配置常用技巧
  • .NET C# 操作Neo4j图数据库
  • .NET Core跨平台微服务学习资源
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Remoting学习笔记(三)信道
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET基础篇——反射的奥妙
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [100天算法】-二叉树剪枝(day 48)