RestTemplate
它RestTemplate
通过 HTTP 客户端库提供了更高级别的 API。它使在一行中调用 REST 端点变得容易。
初始化
默认构造函数用于java.net.HttpURLConnection
执行请求。您可以切换到具有ClientHttpRequestFactory
. 有对以下内容的内置支持:
- Apache HttpComponents
- 网状
- OkHttp
例如,要切换到 Apache HttpComponents,您可以使用以下命令:
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
URI
许多RestTemplate
方法接受 URI 模板和 URI 模板变量,或者作为String
变量参数,或者作为Map<String,String>
.
以下示例使用String
变量参数:
String result = restTemplate.getForObject(
"https://example.com/hotels/{hotel}/bookings/{booking}", String.class, "42", "21");
以下示例使用Map<String, String>
:
Map<String, String> vars = Collections.singletonMap("hotel", "42");
String result = restTemplate.getForObject(
"https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars);
请记住,URI 模板是自动编码的,如以下示例所示:
restTemplate.getForObject("https://example.com/hotel list", String.class);
// Results in request to "https://example.com/hotel%20list"
您可以使用 的uriTemplateHandler
属性来自RestTemplate
定义 URI 的编码方式。或者,您可以准备 java.net.URI
并将其传递给RestTemplate
接受 a 的方法之一URI
。
标头
您可以使用这些exchange()
方法来指定请求标头,如以下示例所示:
String uriTemplate = "https://example.com/hotels/{hotel}";
URI uri = UriComponentsBuilder.fromUriString(uriTemplate).build(42);
RequestEntity<Void> requestEntity = RequestEntity.get(uri)
.header("MyRequestHeader", "MyValue")
.build();
ResponseEntity<String> response = template.exchange(requestEntity, String.class);
String responseHeader = response.getHeaders().getFirst("MyResponseHeader");
String body = response.getBody();
您可以通过许多RestTemplate
返回 ResponseEntity
.
消息体
传递给方法和从RestTemplate
方法返回的对象在HttpMessageConverter
.
在 POST 上,输入对象被序列化为请求正文,如以下示例所示:
URI location = template.postForLocation("https://example.com/people", person);
您无需显式设置请求的 Content-Type 标头。在大多数情况下,您可以根据源Object
类型找到兼容的消息转换器,并且选择的消息转换器会相应地设置内容类型。如有必要,您可以使用这些 exchange
方法显式提供Content-Type
请求标头,这反过来会影响选择的消息转换器。
在 GET 上,响应的主体被反序列化为 output Object
,如以下示例所示:
Person person = restTemplate.getForObject("https://example.com/people/{id}", Person.class, 42);
请求的Accept
标头不需要显式设置。在大多数情况下,可以根据预期的响应类型找到兼容的消息转换器,然后有助于填充Accept
标头。如有必要,您可以使用这些exchange
方法显式提供Accept
标头。
默认情况下,RestTemplate
注册所有内置 消息转换器,具体取决于有助于确定存在哪些可选转换库的类路径检查。您还可以将消息转换器设置为显式使用。
消息转换
该spring-web
模块包含通过和HttpMessageConverter
读取和写入 HTTP 请求和响应正文的合同。 实例用于客户端和服务器端
框架中提供了主要媒体 (MIME) 类型的具体实现,默认情况下,RestTemplate
在客户端和 RequestMethodHandlerAdapter
服务器端注册。
的实现HttpMessageConverter
将在以下部分中描述。对于所有转换器,都使用默认媒体类型,但您可以通过设置 supportedMediaTypes
bean 属性来覆盖它。下表描述了每个实现:
Jackson视图
您可以指定Jackson JSON 视图 以仅序列化对象属性的子集,如以下示例所示:
MappingJacksonValue value = new MappingJacksonValue(new User("eric", "7!jd#h23"));
value.setSerializationView(User.WithoutPasswordView.class);
RequestEntity<MappingJacksonValue> requestEntity =
RequestEntity.post(new URI("https://example.com/user")).body(value);
ResponseEntity<String> response = template.exchange(requestEntity, String.class);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY