[使用RESTTemplate springboot使用公共REST API

问题描述 投票:0回答:1

[我正在尝试使用公共API,在调用从RestTemplate编码为UTF-8的URL时,如从URL返回的responseHeader中未得到响应,可能会看到它也在将UTF-8编码作为参数值] >

为了避免这种尝试使用URLDecoder解码URL,但随后出现类似的错误

java.lang.IllegalArgumentException:没有足够的变量值可用于扩展'!join%20from = id%20to = root

'

UTF-8编码的URL:

https://registers.esma.europa.eu/solr/esma_registers_upreg/select?q=%7B!join+from%3Did+to%3D_root_%7Dae_entityTypeCode%3AMIR&fq=(type_s%3Aparent)(entity_type%3AaeActivity)(entity_type%3AaeActivityHistory)&rows=1000&wt=json&indent=true

解码的URL:

https://registers.esma.europa.eu/solr/esma_registers_upreg/select?q={!join from=id to=_root_}ae_entityTypeCode:MIR&fq=(type_s:parent)(entity_type:aeActivity)(entity_type:aeActivityHistory)&rows=1000&wt=json&indent=true

代码段:

@Component
@Slf4j
public class RestClient {

   private final RestTemplate restTemplate;

   public RestClient(RestTemplate restTemplate) {
      this.restTemplate = restTemplate;
   }

   private Object callExternalRestService(String url) throws FirdsFailureException {
      try {
         MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
         converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON));
         restTemplate.getMessageConverters().add(converter);
         ResponseEntity<Object> response = restTemplate.exchange(
               url,
               HttpMethod.GET,
               null,
               new ParameterizedTypeReference<Object>() {
               });
         log.info("Response from External Service : {}", response);
         log.info("Response Body from External Service : {}", response.getBody());
         return response.getBody();
      }catch (Exception e){
         log.error("",e);
      }
      return null;
   }

}

例外-

请参阅下面的例外情况-

Caused by: com.demo.adapter.firds.FirdsFailureException: java.lang.IllegalArgumentException: Not enough variable values available to expand '!join%20from=id%20to=_root_'
        at com.demo.adapter.firds.RestClient.callExternalRestService(RestClient.java:58)
        at com.demo.adapter.firds.RestClient.getExternalServiceData(RestClient.java:35)
        at com.demo.adapter.firds.RestClient$$FastClassBySpringCGLIB$$341b0269.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.retry.interceptor.RetryOperationsInterceptor$1.doWithRetry(RetryOperationsInterceptor.java:91)
        at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287)
        ... 22 common frames omitted
Caused by: java.lang.IllegalArgumentException: Not enough variable values available to expand '!join%20from=id%20to=_root_'
        at org.springframework.web.util.UriComponents$VarArgsTemplateVariables.getValue(UriComponents.java:329)
        at org.springframework.web.util.HierarchicalUriComponents$QueryUriTemplateVariables.getValue(HierarchicalUriComponents.java:899)
        at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:232)
        at org.springframework.web.util.HierarchicalUriComponents.expandQueryParams(HierarchicalUriComponents.java:347)
        at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:332)
        at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:48)
        at org.springframework.web.util.UriComponents.expand(UriComponents.java:165)
        at org.springframework.web.util.UriComponentsBuilder.buildAndExpand(UriComponentsBuilder.java:360)
        at org.springframework.web.util.DefaultUriTemplateHandler.expandAndEncode(DefaultUriTemplateHandler.java:140)
        at org.springframework.web.util.DefaultUriTemplateHandler.expandInternal(DefaultUriTemplateHandler.java:104)
        at org.springframework.web.util.AbstractUriTemplateHandler.expand(AbstractUriTemplateHandler.java:106)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:612)
        at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:312)
        at com.demo.adapter.firds.RestClient.callExternalRestService(RestClient.java:46)
        ... 29 common frames omitted

有人可以让我知道我是否缺少某些东西或做错了什么

我正在尝试使用公共API,在调用从RestTemplate编码为UTF-8的URL时,如从URL返回的responseHeader中未得到响应,可能会看到它正在对...进行编码]]

java spring-boot resttemplate
1个回答
0
投票

只需在传递REST模板之前解码URL,如下所示:

String url = "https://registers.esma.europa.eu/solr/esma_registers_upreg/select?q=%7B!join+from%3Did+to%3D_root_%7Dae_entityTypeCode%3AMIR&fq=(type_s%3Aparent)(entity_type%3AaeActivity)(entity_type%3AaeActivityHistory)&rows=1000&wt=json&indent=true";
String decodedUrl =  URLDecoder.decode(url.toString(), "UTF-8");
© www.soinside.com 2019 - 2024. All rights reserved.