Spring系列之RestTemplate-21

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将在以下部分中描述。对于所有转换器,都使用默认媒体类型,但您可以通过设置 supportedMediaTypesbean 属性来覆盖它。下表描述了每个实现:

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);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值