SpringBoot中的RestTemplate 简述:SpringBoot中没有动配置RestTemplateSpringBoot提供了RestTemplateBuilderRestTemplateBuilder。build() 常法GET请求getForObject()getForEntity()POST请求postForObject()postForEntity()PUT请求put()DELETE请求delete() 构造URI构造URIUriComponentsBuilder构造相对于当前请求的URIServletUriComponentsBuilder构造指向Controller的URIMvcUriComponentsBuilder RestTemplate 官网地址:https:docs。spring。iospringframeworkdocscurrentreferencehtmlweb。htmlwebmvcclient RestTemplate是执行HTTP请求的同步客户端。它是原始的SpringREST客户端,并在底层HTTP客户端库上公开了一个简单的模板方法API。 从5。0开始,RestTemplate处于维护模式,只接受少量的更改请求和bug。请考虑使用WebClient,它提供了更现代的API并支持同步、异步和流场景。 可参阅RESTEndpoints了解详细信息。 RestTemplate在HTTP客户端库上提供了更高级别的API。它使在单行中调用RESTendpoints变得容易。它公开了以下几组重载方法: Methodgroup 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。注意,JDKHttpURLConnection不支持PATCH,但ApacheHttpComponents和其他组件支持。 delete 使用DELETE方法删除指定URI处的资源。 optionsForAllow 使用ALLOW方法检索资源允许调用的HTTP方法 exchange 在需要时能够提供额外灵活性,比前面的方法更一般化(且不那么自以为是)的版本。它接受一个RequestEntity(包括HTTP方法、URL、报头和主体作为输入)并返回一个ResponseEntity。 这些方法允许使用ParameterizedTypeReference而不是Class来指定具有泛型的响应类型。 execute 执行请求的最通用方法,通过回调接口完全控制请求准备和响应提取。Initialization 默认构造函数使用java。net。HttpURLConnection执行请求。您可以切换到具有ClientHttpRequestFactory实现的不同HTTP库。内置支持以下功能:ApacheHttpComponentsNettyOkHttp 例如,要切换到ApacheHttpComponents,可以使用以下代码: RestTemplatetemplatenewRestTemplate(newHttpComponentsClientHttpRequestFactory()); 每个ClientHttpRequestFactory公开特定于底层HTTP客户端库的配置选项例如:连接池或其他细节。 注意,在访问表示错误(例如401)的响应状态时,java。net对HTTP请求的实现可能会引发异常。如果这是一个问题,请切换到另一个HTTP客户端库。URIs 许多RestTemplate方法接受URI模板和URI模板变量,要么作为String变量参数,要么作为MapString,String。 下面的例子使用了String变量参数:StringresultrestTemplate。getForObject(https:example。comhotels{hotel}bookings{booking},String。class,42,21); 下面的例子使用MapString,String:MapString,StringvarsCollections。singletonMap(hotel,42);StringresultrestTemplate。getForObject(https:example。comhotels{hotel}rooms{hotel},String。class,vars); 请记住URI模板是自动编码的,如下例所示:restTemplate。getForObject(https:example。comhotellist,String。class);Resultsinrequesttohttps:example。comhotel20list 可以使用RestTemplate的uriTemplateHandler属性来自定义uri的编码方式。或者,可以准备一个java。net。URI,并将它传递到一个能够接受URI的RestTemplate方法。 有关使用和编码URI的更多细节,请参见URILinksHeaders 可以使用exchange()方法来指定请求头,如下例所示:StringuriTemplatehttps:example。comhotels{hotel};URIuriUriComponentsBuilder。fromUriString(uriTemplate)。build(42);RequestEntityVoidrequestEntityRequestEntity。get(uri)。header(MyRequestHeader,MyValue)。build();ResponseEntityStringresponsetemplate。exchange(requestEntity,String。class);StringresponseHeaderresponse。getHeaders()。getFirst(MyResponseHeader);Stringbodyresponse。getBody(); 可以通过诸多返回ResponseEntity的RestTemplate方法变体获得响应头。Body 传入RestTemplate方法和从RestTemplate方法返回的对象与原始内容进行转换是通过HttpMessageConverter实现的。 在POST中,输入对象被序列化到请求体中,如下例所示:URIlocationtemplate。postForLocation(https:example。compeople,person); 一般来说,不需要显式地设置请求的ContentType头。在大多数情况下,可以根据源Object类型找到一个适配的MessageConverter,所选的消息转换器也会设置对应的ContentType。如果有必要,可以使用exchange方法显式提供ContentType请求头,而这又会影响选择什么消息转换器。 在GET中,响应体被反序列化为Object,如下例所示:PersonpersonrestTemplate。getForObject(https:example。compeople{id},Person。class,42); 一般来说,请求的Accept头也不需要显式设置。在大多数情况下,可以根据预期的响应类型找到兼容的MessageConverter,它会填充Accept请求头。如果需要,可以使用exchange方法显式地提供Accept头。 默认情况下,RestTemplate根据类路径检索并注册所有内置的messageconverters,类路径检索也有助于确定存在哪些可选的转换库。也可以显示的设置要使用的消息转换器。MessageConversion springweb模块包含HttpMessageConverter,用于通过InputStream和OutputStream读取和写入HTTP请求体和响应体。HttpMessageConverter实例克用于客户端(例如,RestTemplate)和服务器端(例如,SpringMVCRESTcontrollers)。 框架中提供了主要的媒体(MIME)类型的具体实现,默认情况下,会注册到客户端的RestTemplate和服务器端的RequestMappingHandlerAdapter(可参阅ConfiguringMessageConverters)。 下面几节将描述HttpMessageConverter的实现。对于所有converters,都会使用默认的媒体类型,但是可以通过设置supportedMediaTypesbean属性来覆盖它。下表描述了每个实现: MessageConverter Description StringHttpMessageConverter 一个HttpMessageConverter实现,可以从HTTP请求和响应中读写String实例。默认情况下,该转换器支持所有文本媒体类型(text),并使用textplain的ContentType进行写入。 FormHttpMessageConverter 可以从HTTP请求和响应读取和写入表单数据的HttpMessageConverter实现。默认情况下,该转换器读取和写入applicationxwwwformurlencoded媒体类型。从MultiValueMapString,String中读取和写入表单数据。转换器也可以写入(但不能读取)从MultiValueMapString,Object中读取的multipartdata。默认情况下,支持multipartformdata。从SpringFramework5。2开始,可以支持额外的multipartsubtypes来写入表单数据。更多细节可参考FormHttpMessageConverter的javadoc。 ByteArrayHttpMessageConverter 一个HttpMessageConverter实现,可以从HTTP请求和响应中读写字节数组。默认情况下,该转换器支持所有媒体类型(),并使用applicationoctetstream的ContentType进行写入。可以通过设置supportedMediaTypes属性并重写getContentType(byte〔〕)方法来覆盖它。 MarshallingHttpMessageConverter 一个HttpMessageConverter实现,它可以通过使用org。springframework。oxm包中的Spring的Marshaller和Unmarshaller抽象来读写XML。该转换器在使用之前需要一个Marshaller和Unmarshaller。可以通过构造器或bean属性来注入。默认情况下,该转换器支持textxml和applicationxml。 MappingJackson2HttpMessageConverter 一个HttpMessageConverter实现,可以通过使用Jackson的ObjectMapper来读写JSON。可以通过使用Jackson提供的注解按需定制JSON映射。当需要进一步控制时(对于需要为特定类型提供自定义JSON序列化器反序列化器的情况),可以通过ObjectMapper属性注入自定义ObjectMapper。默认情况下,该转换器支持applicationjson。 MappingJackson2XmlHttpMessageConverter 一个HttpMessageConverter实现,它可以通过使用JacksonXML扩展的XmlMapper来读写XML。您可以根据需要通过使用JAXB或Jackson提供的注解自定义XML映射。当需要进一步控制时(对于需要为特定类型提供自定义XML序列化器反序列化器的情况),可以通过ObjectMapper属性注入自定义XmlMapper。默认情况下,该转换器支持applicationxml。 SourceHttpMessageConverter 一个可以从HTTP请求和响应读写javax。xml。transform。Source的HttpMessageConverter实现。只支持DOMSource、SAXSource和StreamSource。默认情况下,该转换器支持textxml和applicationxml。 BufferedImageHttpMessageConverter 一个HttpMessageConverter实现,可以从HTTP请求和响应中读写java。awt。image。BufferedImage。该转换器读写JavaIOAPI支持的媒体类型。JacksonJSONViews 你可以指定JacksonJSONView来序列化对象属性的一个子集,如下例所示:MappingJacksonValuevaluenewMappingJacksonValue(newUser(eric,7!jdh23));value。setSerializationView(User。WithoutPasswordView。class);RequestEntityMappingJacksonValuerequestEntityRequestEntity。post(newURI(https:example。comuser))。body(value);ResponseEntityStringresponsetemplate。exchange(requestEntity,String。class);Multipart 要发送multipartdata,需要提供MultiValueMapString,Object,其值可能是部分内容的Object,文件部分的Resource,或带有头的部分内容的HttpEntity。例如:MultiValueMapString,ObjectpartsnewLinkedMultiValueMap();parts。add(fieldPart,fieldValue);parts。add(filePart,newFileSystemResource(。。。logo。png));parts。add(jsonPart,newPerson(Jason));HttpHeadersheadersnewHttpHeaders();headers。setContentType(MediaType。APPLICATIONXML);parts。add(xmlPart,newHttpEntity(myBean,headers)); 在大多数情况下,不必为每个部分指定ContentType。内容类型可以根据选择序列化它的HttpMessageConverter自动确定;在Resource的情况下可以根据文件扩展名确定。如果需要,可以显式地用HttpEntitywrapper提供MediaType。 一旦MultiValueMap准备好了,你可以将它传递给RestTemplate,如下所示:MultiValueMapString,Objectparts。。。;template。postForObject(https:example。comupload,parts,Void。class); 如果MultiValueMap包含至少一个非String值,则内容类型被FormHttpMessageConverter设置为multipartformdata。如果MultiValueMap仅有String值,则ContentType默认为applicationxwwwformurlencoded。如果需要,还可以显式地设置ContentType。RESTendpoints Spring框架为调用RESTendpoints提供了两种选择:RestTemplate:带有同步、模板方法API的原始SpringREST客户端。WebClient:一个支持同步和异步以及流场景的非阻塞的、响应式的替代方案。