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: 一个支持同步和异步以及流场景的非阻塞的、响应式的替代方案。
数字经济发展站上风口代表委员热议数实融合证券时报记者严翠从2017年政府工作报告提出促进数字经济加快成长,到今年政府工作报告提出大力发展数字经济,提升常态化监管水平,支持平台经济发展,六年间,数字经济已六次被写入政府报告
春雷惊蛰万物苏,养生记得这些要点!惊蛰时节,春意渐浓今天是二十四节气中的惊蛰。时至惊蛰,阳气上升,气温回暖,春雷乍动,雨水增多,万物生机盎然。上海中医药大学附属岳阳中西医结合医院心病科周训杰副主任医师告诉海岸君,惊
长沙制造赶海掘金全球抢春光繁忙的长沙港成出海口之一。红网时刻新闻记者彭超长沙报道春潮涌动来踏浪,长沙制造出海忙。新春伊始,长沙打响全力以赴拼经济促发展的发令枪。长沙制造业企业抢抓机遇,在海外拓展市场纷纷按下
内衣选码小技巧,让你气质瞬间提升!你可能会疑惑内衣选码,怎么会和个人气质挂钩呢?因为,现在对于我们女性来说,内衣真的不仅是一件衣服,它可以是装饰也会和咱们的健康有联系它会影响我们的心情,一件既合适又适合的内衣,会让
凌晨5点到岗,一天上千次蹲起,女安检员林燕妮的日常了不起的她山东省属国企三八妇女节特别策划第三期,我们听山东省机场管理集团济南国际机场(下称济南机场)安全检查员林燕妮说。见过凌晨五点济南的,不一定只有垃圾清运工外卖小哥的士司机,在
iPhone15侧面图曝光,不支持全天候显示功能据韩国Naver博客上的新闻聚合账号yeux1122引述的一位业内人士消息,苹果标准版iPhone15将不配备LTPO显示屏,意味着该机将不支持ProMotion自适应刷新率和全天
给大家科普下LV包包的材质大家好,我是小磊,今天咱们系统的聊一下奢侈品包包材质和它们的特点以及选购的一些侧重点,还有Louisvuitton这个系列。了解LV历史的人都知道最早出现的标志性产品不是老花,而是
古驰华伦天奴蔻驰。时尚品牌为何都亲自下场做二手生意?界面新闻记者陈奇锐界面新闻编辑楼婍沁越来越多时尚品牌决心要在二手市场掌握主动权。旗下拥有Coach和KateSpade等品牌的美国Tapestry集团近期推在日本推出COACH(R
做你的心动CRUSH王心新小红书ID王心新年龄27岁星座巨蟹座职业演员模特演艺行业混子,哪有需要哪有我灰色无袖连帽背心Dsquared2白色长袖衬衫MLB黑色户外休闲裤FilippaK橙色Logo运动
是走秀还是搞擦边球,巴黎时装周惹争议,超模集体真空上阵嗨,辣条与你一起吃瓜巴黎时装周这两天在内娱的热度可不低,因为超模的状态故而就引起很大争议。不禁发出灵魂质问,这是在走秀,还是为了取悦男观众搞擦边球?这是走秀吗?这是时装周吗?一眼望
跟着杨采钰逛胡同,被她种草了10086次西装杨采钰复古西装穿搭小课堂又又又又开讲啦!初春,杨采钰逛北京老胡同的穿搭真的太有复古摩登女郎那味了吧黑色短西装水洗蓝牛仔裤毛呢贝雷帽再加上猫眼墨镜,说是九十年代的老北京街拍照进现实!
12GB512GB150W,跌至2899元,被低估的冷门手机手机内卷带来的一个好处就是,手机厂商们为了抢占份额,所以也会不惜成本降价,比如一加Ace,它是一加公司4月份发布的手机,原本它的性价比就很高,而且还有很突出的卖点,如今发布半年后,
囤iPhone14亏惨时代变了,黄牛还活在过去文王新喜在今天,还以为囤苹果手机能发财,黄牛的思维无疑还停留在56年前。有业内人士向笔者这样说到。早在今年67月,iPhone高端版涨价的新闻层出不穷,彼时大量黄牛在蠢蠢欲动,不少
当国际小熊猫日遇上全国科普日湖北日报讯(记者魏铼通讯员张晓敏)为了保护小熊猫,每年9月第三个周六被定为国际小熊猫日,这一天又恰逢全国科普日。9月17日,武汉九峰森林动物园联合湖北省林业科学研究院共同举办了一场
我们都是一个平凡的人郝有花人生最幸福的事不是有人懂你,是你懂得生活一路阳光,一路浅行说什么爱恨情仇,谈什么聚散别离说到底,只是一场空人生就是一场修行好的,坏的,聚在一起分不清对与错,远与近只要心里藏有
顿悟之后解脱过去心不可得,现在心不可得,未来心不可得。金刚经这样说,好长时间理解不了。生活看起来很神秘,不同人有不同的地位,不同人有不同的经历,有的波澜壮阔一生,终生被人敬仰。有的人一辈子平平
郭进拴鳌头之歌郭进拴鳌头之歌就地理环境而言,我的家乡鳌头这一带既无黄山的云海,匡庐的劲松,又无泰山的雄浑华山的惊险,更无漓江的烟雨阳朔的秀峰,有的只是恬静幽雅闲适的田园风光阳春三月,春风和煦,紫
践行嘱托三年间信阳答卷特刊老区沃野织锦绣9月,丰收的季节。申城大地沃野平畴,流金叠翠。中秋小长假,去郝家冲村体验网红小火车,看茶乡风光的视频刷爆了信阳市民的朋友圈。漫步郝家冲村,桂花扑鼻香,风景美如画。远山上吉小象何家寨
谱写全域旅游华章构建文旅融合格局记者张新义熊国森通讯员李璞段阳东美丽的老乐山脚下,溪流淙淙绿树掩映,远山如黛层峦叠嶂。新龙门客栈酒旗飘扬,农家小院宾客盈门,公园绿地游人如织,林荫小路川流不息近日,在刚建成不久的确
交河故城,大地上雕刻出来的城市文卞文志中国西部的古城遗址沉淀了厚重的岁月沧桑,它们是一段段历史的标签,更是古代中原王朝与西域文化经贸交流的直接见证。在这其中,交河故城就是具有非凡意义的一座经典城墟。它自创建至今
反美元霸权联盟成立!中国领头容纳30亿人,世界格局从此颠覆9月15日,上海合作组织峰会,在乌兹别克斯坦第二大城市撒马尔罕召开。耐人寻味的是,这次会议有2个不同寻常之处首先,这是中国领导人在新冠疫情2年后,首次进行外事访问。此前2年,我们都
湖南2市将晋级II型大城市6县晋级中等城市,益阳上榜随着我国城市化的不断发展,人口不断地变迁,越来越多的人往城市聚集,城市的常住人口数量也在逐年增加。劳动力人口的增加有助于城市的快速发展,城市的规模也不断变化。湖南省地处云贵高原向江