example - ajax spring
Usando RestTemplate en la primavera. Excepción: no hay suficientes variables disponibles para expandir (4)
La causa principal es que RestTemplate
considera las llaves {...}
en la URL dada como un marcador de posición para las variables URI e intenta reemplazarlas en función de su nombre. Por ejemplo
{pageSize}
trataría de obtener una variable URI llamada pageSize
. Estas variables de URI se especifican con algunos de los otros métodos getForObject
sobrecargados. No ha proporcionado ninguno, pero su URL espera uno, por lo que el método lanza una excepción.
Una solución es hacer un objeto String
que contenga el valor
String sort = "{/"price/":/"desc/"}";
y proporciona una variable URI real en tu URL
String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={sort}";
Usted llamaría a su getForObject()
como tal
OutputPage page = restTemplate.getForObject(url1, OutputPage.class, sort);
Le sugiero encarecidamente que no envíe ningún JSON en un parámetro de solicitud de una solicitud GET, sino que lo envíe en el cuerpo de una solicitud POST.
Estoy tratando de acceder a los contenidos de una API y necesito enviar una URL usando RestTemplate.
String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={/"price/":/"desc/"}";
OutputPage page = restTemplate.getForObject(url1, OutputPage .class);
Pero, estoy recibiendo el siguiente error.
Exception in thread "main" java.lang.IllegalArgumentException: Not enough variable values available to expand ''"price"''
at org.springframework.web.util.UriComponents$VarArgsTemplateVariables.getValue(UriComponents.java:284)
at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:220)
at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:317)
at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:46)
at org.springframework.web.util.UriComponents.expand(UriComponents.java:162)
at org.springframework.web.util.UriTemplate.expand(UriTemplate.java:119)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:501)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:239)
at hello.Application.main(Application.java:26)
Si elimino los criterios de clasificación, está funcionando correctamente. Necesito analizar el JSON usando criterios de clasificación. Cualquier ayuda será muy apreciada.
Gracias
Puede URL codificar los valores de los parámetros:
String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort=";
org.apache.commons.codec.net.URLCodec codec = new org.apache.commons.codec.net.URLCodec();
url1 = url1 + codec.encode("{/"price/":/"desc/"}");
OutputPage page = restTemplate.getForObject(url1, OutputPage.class);
Si la solución sugerida por es un poco difícil de implementar en un escenario, y si se garantiza que la cadena URI que contiene llaves y otros caracteres es correcta, podría ser más sencillo pasar la cadena URI codificada a un método de RestTemplate
que golpea el servidor ReST
.
La cadena de URI se puede construir usando UriComponentsBuilder.build() , codificada usando UriComponents.encode() , y se envía usando RestTemplate.exchange() esta manera:
public ResponseEntity<Object> requestRestServer()
{
HttpEntity<?> entity = new HttpEntity<>(requestHeaders);
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(rawValidUrl)
.queryParams(
(LinkedMultiValueMap<String, String>) allRequestParams);
UriComponents uriComponents = builder.build().encode();
ResponseEntity<Object> responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,
entity, String.class);
return responseEntity;
}
La construcción, la codificación y la extracción de URI se han separado para mayor claridad en el fragmento de código anterior.
simplemente puede agregar una variable a la URL y pasar el valor de la variable en el método restTemplate.postForObject .
String url1 = "http://api.example.com/Search?
key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={data}";
String data="{/"price/":/"desc/"}";
OutputPage page = restTemplate.getForObject(url1, OutputPage.class, data);