[我正在尝试使用公共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中未得到响应,可能会看到它正在对...进行编码]]
只需在传递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");