Tengo que hacer una REST
llamada que incluya encabezados personalizados y parámetros de consulta. Configuré mi HttpEntity
solo con los encabezados (sin cuerpo), y uso el RestTemplate.exchange()
método de la siguiente manera:
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");
Map<String, String> params = new HashMap<String, String>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);
HttpEntity entity = new HttpEntity(headers);
HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, params);
Esto falla en el extremo del cliente al dispatcher servlet
no poder resolver la solicitud a un controlador. Después de depurarlo, parece que los parámetros de solicitud no se están enviando.
Cuando hago un intercambio con el POST
uso de un cuerpo de solicitud y sin parámetros de consulta, funciona bien.
¿Alguien tiene alguna idea?
exchange
agetForEntity
:restTemplate.getForEntity(builder.build().encode().toUri(), String.class);
por simplicidad.exchange
y proporcionar unParameterizedTypeReference
. Sin embargo, el ejemplo se puede simplificar aún más, reemplazandobuilder.build().encode().toUri()
conbuilder.toUriString()
.builder.toUriString()
Las uriVariables también se expanden en la cadena de consulta. Por ejemplo, la siguiente llamada expandirá los valores para ambos, cuenta y nombre:
entonces la URL de solicitud real será
Mire HierarchicalUriComponents.expandInternal (UriTemplateVariables) para más detalles. La versión de Spring es 3.1.3.
fuente
UriComponentsBuilder
ninguno, ya que está causando que genere una métrica diferente para cada solicitud conMicrometer
RestTemplate
tiene métodos paralelos para especificar una matriz posicional de valores (Object... uriVariables
) o un mapa de valores con nombre (Map<String, ?> uriVariables
). Sonidos como la versión del mapa es lo que quiere:restTemplate.exchange(url, HttpMethod.GET, httpEntity, clazz, urlVariablesMap)
.Desde al menos Spring 3, en lugar de usar
UriComponentsBuilder
para construir la URL (que es un poco detallado), muchos de losRestTemplate
métodos aceptan marcadores de posición en la ruta de los parámetros (no soloexchange
).De la documentación:
Referencia: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri
Si nos fijamos en el JavaDoc para
RestTemplate
y la búsqueda de "Plantilla URI", se puede ver qué métodos se pueden utilizar marcadores de posición con.fuente
Bien, estoy siendo un idiota y estoy confundiendo los parámetros de consulta con los parámetros de URL. Esperaba que hubiera una mejor manera de llenar los parámetros de mi consulta en lugar de una cadena concatenada fea, pero ahí estamos. Es simplemente un caso de construir la URL con los parámetros correctos. Si lo pasa como String Spring también se encargará de la codificación por usted.
fuente
Estaba intentando algo similar, y el ejemplo de RoboSpice me ayudó a resolverlo :
fuente
RestTemplate: Construya URI dinámico usando UriComponents (variable URI y parámetros de solicitud)
fuente
Conversión de un mapa hash en una cadena de parámetros de consulta:
fuente
Tomo un enfoque diferente, puede estar de acuerdo o no, pero quiero controlar desde el archivo .properties en lugar del código compilado de Java
Dentro del archivo application.properties
endpoint.url = https: // yourHost / resource? requestParam1 = {0} & requestParam2 = {1}
El código Java va aquí, puede escribir if o cambiar la condición para averiguar si la URL del punto final en el archivo .properties tiene @PathVariable (contiene {}) o @RequestParam (yourURL? Key = value), etc. ... luego invoque el método en consecuencia. de esa manera es dinámico y no necesita cambiar el código en una ventanilla única en el futuro ...
Estoy tratando de dar más idea que el código real aquí ... intente escribir un método genérico para @RequestParam y @PathVariable, etc. ... luego llame en consecuencia cuando sea necesario
fuente
En Spring Web 4.3.6 también veo
Eso significa que no tienes que crear un mapa feo
Entonces, si tienes esta url
Puedes hacer
o
fuente
fuente
Si pasa parámetros no parametrizados para RestTemplate, tendrá una métrica para cada una de las diferentes URL que pase, teniendo en cuenta los parámetros. Te gustaría usar URL parametrizadas:
en vez de
El segundo caso es lo que obtienes al usar la clase UriComponentsBuilder.
Una forma de implementar el primer comportamiento es la siguiente:
fuente
Si tu url es
http://localhost:8080/context path?msisdn={msisdn}&email={email}
luego
funciona para el método de cambio de plantilla como lo describió usted
fuente