RESTClients通过RestTemplate访问Web资源
Spring Boot 中的 RestTemplate
简述:Spring Boot 中没有⾃动配置 RestTemplateSpring Boot 提供了 RestTemplateBuilderRestTemplateBuilder.build()
常⽤⽅法GET 请求getForObject() / getForEntity()POST 请求postForObject() / postForEntity()PUT 请求put()DELETE 请求delete()
构造 URI构造 URIUriComponentsBuilder构造相对于当前请求的 URIServletUriComponentsBuilder构造指向 Controller 的 URIMvcUriComponentsBuilder
RestTemplate
官网地址:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#webmvc-client
RestTemplate是执行HTTP请求的同步客户端。它是原始的Spring REST客户端,并在底层HTTP客户端库上公开了一个简单的模板方法API。
从5.0开始,RestTemplate处于维护模式,只接受少量的更改请求和bug。请考虑使用 WebClient,它提供了更现代的API并支持同步、异步和流场景。
可参阅 REST Endpoints 了解详细信息。
RestTemplate在HTTP客户端库上提供了更高级别的API。它使在单行中调用 REST endpoints变得容易。它公开了以下几组重载方法:
Method group
Description
getForObject
通过使用GET方法得到一个 响应体的 Object
getForEntity
通过使用GET方法得到一个ResponseEntity(包括 status, headers, body )。
headForHeaders
通过使用HEAD方法得到资源的所有 headers。
postForLocation
通过使用POST方法创建一个新资源,并从返回响应中的Location头。
postForObject
使用POST方法创建新资源,并返回 响应体的 Object。
postForEntity
使用POST方法创建新资源,并返回响应的ResponseEntity。
put
通过使用PUT方法创建或更新资源。
patchForObject
使用PATCH方法更新资源,并返回 响应体的 Object。注意,JDK HttpURLConnection不支持PATCH,但Apache HttpComponents和其他组件支持。
delete
使用DELETE方法删除指定URI处的资源。
optionsForAllow
使用ALLOW方法检索资源允许调用的HTTP方法
exchange
在需要时能够提供额外灵活性,比前面的方法更一般化(且不那么自以为是)的版本。它接受一个RequestEntity(包括HTTP方法、URL、报头和主体作为输入)并返回一个ResponseEntity。
这些方法允许使用ParameterizedTypeReference而不是Class来指定具有泛型的响应类型。
execute
执行请求的最通用方法,通过回调接口完全控制请求准备和响应提取。 Initialization
默认构造函数使用java.net.HttpURLConnection执行请求 。 您可以切换到具有ClientHttpRequestFactory实现的不同HTTP库 。内置支持以下功能: Apache HttpComponents Netty OkHttp
例如,要切换到Apache HttpComponents,可以使用以下代码:
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
每个ClientHttpRequestFactory公开特定于底层HTTP客户端库的配置选项——例如:连接池或其他细节。
注意,在访问表示错误(例如401)的响应状态时,java.net对HTTP请求的实现可能会引发异常。如果这是一个问题,请切换到另一个HTTP客户端库。 URIs
许多RestTemplate方法接受URI模板和URI模板变量,要么作为String变量参数,要么作为Map。
下面的例子使用了String变量参数: String result = restTemplate.getForObject( "https://example.com/hotels/{hotel}/bookings/{booking}", String.class, "42", "21");
下面的例子使用Map: Map 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"
可以使用RestTemplate的uriTemplateHandler属性来自定义uri的编码方式。或者,可以准备一个java.net.URI,并将它传递到一个能够接受URI的RestTemplate方法。
有关使用和编码URI的更多细节,请参见 URI LinksHeaders
可以使用exchange()方法来指定请求头,如下例所示: String uriTemplate = "https://example.com/hotels/{hotel}"; URI uri = UriComponentsBuilder.fromUriString(uriTemplate).build(42); RequestEntity requestEntity = RequestEntity.get(uri) .header("MyRequestHeader", "MyValue") .build(); ResponseEntity response = template.exchange(requestEntity, String.class); String responseHeader = response.getHeaders().getFirst("MyResponseHeader"); String body = response.getBody();
可以通过诸多返回ResponseEntity的RestTemplate方法变体获得响应头。 Body
传入RestTemplate方法和从RestTemplate方法返回的对象与原始内容进行转换是通过HttpMessageConverter实现的。
在POST中,输入对象被序列化到请求体中,如下例所示: URI location = template.postForLocation("https://example.com/people", person);
一般来说,不需要显式地设置请求的Content-Type头。在大多数情况下,可以根据源Object类型找到一个适配的MessageConverter,所选的消息转换器也会设置对应的Content-Type。如果有必要,可以使用 exchange方法显式提供Content-Type请求头,而这又会影响选择什么消息转换器。
在GET中,响应体被反序列化为 Object,如下例所示: Person person = restTemplate.getForObject("https://example.com/people/{id}", Person.class, 42);
一般来说,请求的Accept头也不需要显式设置。在大多数情况下,可以根据预期的响应类型找到兼容的MessageConverter,它会填充Accept请求头。如果需要,可以使用 exchange方法显式地提供Accept头。
默认情况下,RestTemplate根据类路径检索并注册所有内置的 message converters ,类路径检索也有助于确定存在哪些可选的转换库。也可以显示的设置要使用的消息转换器。 Message Conversion
spring-web模块包含HttpMessageConverter,用于通过InputStream和OutputStream读取和写入HTTP请求体和响应体。HttpMessageConverter实例克用于客户端(例如,RestTemplate)和服务器端(例如,Spring MVC REST controllers)。
框架中提供了主要的媒体(MIME)类型的具体实现,默认情况下,会注册到客户端的RestTemplate和服务器端的RequestMappingHandlerAdapter(可参阅 Configuring Message Converters)。
下面几节将描述HttpMessageConverter的实现。对于所有 converters,都会使用默认的媒体类型,但是可以通过设置supportedMediaTypes bean属性来覆盖它。下表描述了每个实现:
MessageConverter
Description
StringHttpMessageConverter
一个HttpMessageConverter实现,可以从HTTP请求和响应中读写String实例。默认情况下,该转换器支持所有文本媒体类型(text/*),并使用text/plain的Content-Type进行写入。
FormHttpMessageConverter
可以从HTTP请求和响应读取和写入表单数据的HttpMessageConverter实现。默认情况下,该转换器读取和写入application/x-www-form-urlencoded媒体类型。从MultiValueMap中读取和写入表单数据。转换器也可以写入(但不能读取)从MultiValueMap中读取的 multipart data 。默认情况下,支持multipart/form-data。从Spring Framework 5.2开始,可以支持额外的 multipart subtypes 来写入表单数据。更多细节可参考FormHttpMessageConverter的javadoc。
ByteArrayHttpMessageConverter
一个HttpMessageConverter实现,可以从HTTP请求和响应中读写字节数组。默认情况下,该转换器支持所有媒体类型(*/*),并使用 application/octet-stream 的 Content-Type进行写入。可以通过设置supportedMediaTypes属性并重写getContentType(byte[])方法来覆盖它。
MarshallingHttpMessageConverter
一个HttpMessageConverter实现,它可以通过使用org.springframework.oxm包中的Spring的Marshaller和Unmarshaller抽象来读写XML。该转换器在使用之前需要一个Marshaller和Unmarshaller。可以通过构造器或bean属性来注入。默认情况下,该转换器支持text/xml和application/xml。
MappingJackson2HttpMessageConverter
一个HttpMessageConverter实现,可以通过使用Jackson的ObjectMapper来读写JSON。可以通过使用Jackson提供的注解按需定制JSON映射。当需要进一步控制时(对于需要为特定类型提供自定义JSON序列化器/反序列化器的情况),可以通过ObjectMapper属性注入自定义ObjectMapper。默认情况下,该转换器支持application/json。
MappingJackson2XmlHttpMessageConverter
一个HttpMessageConverter实现,它可以通过使用 Jackson XML 扩展的XmlMapper来读写XML。您可以根据需要通过使用JAXB或Jackson提供的注解自定义XML映射。当需要进一步控制时(对于需要为特定类型提供自定义XML序列化器/反序列化器的情况),可以通过ObjectMapper属性注入自定义XmlMapper。默认情况下,该转换器支持application/xml。
SourceHttpMessageConverter
一个可以从HTTP请求和响应读写javax.xml.transform.Source的HttpMessageConverter实现。只支持DOMSource、SAXSource和StreamSource。默认情况下,该转换器支持text/xml和application/xml。
BufferedImageHttpMessageConverter
一个HttpMessageConverter实现,可以从HTTP请求和响应中读写java.awt.image.BufferedImage。该转换器读写Java I/O API支持的媒体类型。 Jackson JSON Views
你可以指定 Jackson JSON View 来序列化对象属性的一个子集,如下例所示: MappingJacksonValue value = new MappingJacksonValue(new User("eric", "7!jd#h23")); value.setSerializationView(User.WithoutPasswordView.class); RequestEntity requestEntity = RequestEntity.post(new URI("https://example.com/user")).body(value); ResponseEntity response = template.exchange(requestEntity, String.class);Multipart
要发送 multipart data,需要提供 MultiValueMap,其值可能是部分内容的Object,文件部分的Resource,或带有头的部分内容的HttpEntity。例如: MultiValueMap parts = new LinkedMultiValueMap<>(); parts.add("fieldPart", "fieldValue"); parts.add("filePart", new FileSystemResource("...logo.png")); parts.add("jsonPart", new Person("Jason")); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_XML); parts.add("xmlPart", new HttpEntity<>(myBean, headers));
在大多数情况下,不必为每个部分指定Content-Type。内容类型可以根据选择序列化它的HttpMessageConverter自动确定;在 Resource 的情况下可以根据文件扩展名确定。如果需要,可以显式地用HttpEntity wrapper提供MediaType。
一旦MultiValueMap准备好了,你可以将它传递给RestTemplate,如下所示: MultiValueMap parts = ...; template.postForObject("https://example.com/upload", parts, Void.class);
如果MultiValueMap包含至少一个非 String值,则内容类型被FormHttpMessageConverter设置为multipart/form-data。如果MultiValueMap仅有 String值,则Content-Type默认为application/x-www-form-urlencoded。如果需要,还可以显式地设置Content-Type。 REST endpoints
Spring框架为调用 REST endpoints提供了两种选择: RestTemplate: 带有同步、模板方法API的原始Spring REST客户端。WebClient: 一个支持同步和异步以及流场景的非阻塞的、响应式的替代方案。
(国际)土耳其千年古堡遭地震损毁据当地媒体报道,土耳其东南部加济安泰普省的加济安泰普古堡在6日发生的地震中严重损毁,城堡的东侧南侧和东南侧堡体在地震中坍塌,残垣断壁滑落到古堡所在山坡下的道路上。根据考古研究,加济
(国际)老挝加紧为中国游客到来做准备随着中国不断优化疫情防控政策,有序恢复公民出境旅游,老挝政府和旅游业正加紧改善旅游设施,提升服务水平,为预期中的大批中国游客到来做好准备。2月7日,游客在老挝首都万象凯旋门附近留影
万般皆是命,半点不由人吗01hr每个人一生中,都有他来到这世间的使命和缘由。人一生下来,和谁结婚,生几个孩子,干什么事业,遇到谁,所有的大事,早有安排。所以,你是什么命,其实早已注定。不管你信不信命,愿不
刀郎的前妻杨娜生下女儿40天便跑路,32年过去了,她可曾后悔过2004年,一首2002年的第一场雪脱颖而出。刀郎性感的烟嗓诉尽了人世的沧桑,叫人沉浸在那大雪纷飞的漫漫寒夜之中。他的歌里没有城市的浮躁与喧嚣,而是充满了天圆地方的广阔与豪迈。该专
金星和妻子结婚10年,离婚时已是女儿身,再婚后被丈夫宠成宝人不犯我,我不犯人人若犯我,礼让三分人再犯我,斩草除根。金星在节目中说的话,众网友不禁感叹听她说话也太过瘾了她的三观真是太正了。不仅如此,她还说不要怪姐狠,姐对自己更狠。当了解她之
身高晚长的孩子,有3个显著特点,没有的孩子就不要多想了在我国这个内卷时代,孩子的身高也是家长之间暗中较劲的对象之一。较劲较赢了还好,较输了的脸上没面子,却总拿我孩子晚长,将来肯定会更高的!来安慰自己。那孩子到底是不是晚长,它是有规律和
夜光杯打包旧事打包这个词,现在已经是常用语了。但是对我来说,第一次看到了解到打包的含义,是在一个特殊的场合特殊的环境下感受和体会到的,从此,终身受益。上世纪80年代中叶,锦江集团和东湖集团先后新
说了多少遍,沙茶汤底不卖在深圳,正宗的沙茶面不多了我们家,只卖沙茶面这次来到了一家位于横岗的面馆,它家从开店以来就只卖厦门沙茶面。沙茶面,是福建厦门当地一种有名的小吃。它里面用到的沙茶,是由多种香料熬制而
因违规使用涉毒演员,热门电视剧狂飙恐遭永久下架禁播!由徐纪周执导,张译张颂文主演的电视剧狂飙自开播以来,剧中的人物例如高启强高启盛李有田徐江等等,大结局更是让很多人至今没有走出来,都在网上掀起了一阵模范,可以说狂飙是近几年来热度最高
生殖崇拜这种畸形之风,正在野蛮生长!去污粉前言去污粉娱乐圈一向都是潮流风向标,对青少年的影响,远比书本,学校教育来的干脆来的直接。如今有一个非常不好的现象生殖崇拜正在荼毒少年,野蛮成长。今天跟大家聊聊生殖崇拜,让更多
孩子个子矮,要不要注射生长激素?怎么注射?赖杰琦核心提示当下,家长越来越重视自己孩子的身高。一是觉得身高关系到颜值,二是认为身高可能会让孩子以后就业能有更多选择。在此情况下,咨询使用生长激素的家长也随之增多。到底什么情况属