Estoy tratando de lograr lo mismo que esto: ¿Cómo usar el parámetro de consulta representado como JSON con Spring RestTemplate? , enviando una cadena JSON como un parámetro de URL en restTemplate.exchange() .
La respuesta aceptada menciona que enviar un objeto JSON como parámetro de solicitud generalmente no es una buena idea, ya que probablemente tendrá problemas con los corchetes dentro de JSON. Eso es exactamente lo que sucede cuando intento hacer una llamada GET a una API. Dado que esta es una API de otro sistema, no puedo pedirles que cambien el formato y tendré que llamar al punto final GET, pasando JSON como parámetro. ¿Cómo puedo lograr esto en la llamada restTemplate.exchange() ?
Nota: La pregunta relacionada mencionada no es una guía sobre cómo superar este problema y no tengo suficiente reputación para comentarla y preguntarle al autor de la respuesta.
Respondiendo a mi propia pregunta. Si bien es una mala idea pasar JSON como este en un parámetro de consulta/url, hay una solución alternativa como se sugiere aquí: https://jira.spring.io/browse/SPR-9220?focusedCommentId=76760&page=com.atlassian. jira.plugin.system.issuetabpanels:comment-tabpanel#comment-76760 .
Replicando el código aquí en caso de que este enlace se corte:
String url = "http://localhost:8983/solr/select?wt=json&indent=true&fl=*&q=*:*&fq={!geofilt}&sfield=venue_location&pt=28.0674,-80.5595&d=25"; URI uri = UriComponentsBuilder.fromUriString(url).build().encode().toUri(); System.out.println(uri); // http://localhost:8983/solr/select?wt=json&indent=true&fl=*&q=*:*&fq=%7B!geofilt%7D&sfield=venue_location&pt=28.0674,-80.5595&d=25 Básicamente, en lugar de pasar una URL con parámetros de consulta/URL JSON como una cadena, pásela como una URI. Luego llame al método de exchange como antes, pero con URI en lugar de String:
restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class)Si se trata de una API de terceros y no puede controlar o cambiar el procesamiento JSON en el backend, no hay solución. Incluso si codificará con URLEncoder, no hay garantía de que el backend de la API procese dicha solicitud correctamente.
Puede usar la clase URLEncoder para codificar la URL en el método de exchange , por ejemplo:
String url = "http://www.yoursite.com/api?param={\"some_key\":\"some_value\"}"; System.out.println(URLEncoder.encode(url, StandardCharsets.UTF_8.name())); Esto codificará los caracteres (como llaves y comillas dobles) y el servidor lo decodificará de nuevo a json .