¿Por qué funciona pasar un Map como JSON en Postman, pero no funciona pasar el mapa en Java RestTemplate?
Este proyecto es para una aplicación WAR que se ejecuta sobre el servidor de aplicaciones JBOSS (GraphClient.war), después de desplegarlo puedo hacer solicitudes a través de URLs como:
http://localhost:8080/GraphClient/helloworld
Llamo a este controlador pasando un Map<String,String>, utilizando Postman y configurando Body > RAW > Json (application/json) y pasando el mapa como:
{
“hello1”: “Jupiter”,
“hello2”: “Mercury”,
“hello3”: “Venus”,
“hello4”: “Mars”,
“hello5”: “Earth”
}
FUNCIONA, pero si envío el mismo Map<String,String> en Java desde otro controlador, obtengo un error 405 método no permitido. Aquí está el código:
@RequestMapping(value=”/callhelloworld”, method=RequestMethod.GET)
public String caller()
{
MultiValueMap<string, string=""> body = new LinkedMultiValueMap<string,string>();
body.add("planet1","Jupiter");
body.add("planet2","Mercury");
body.add("planet3","Venus");
body.add("planet4","Mars");
body.add("planet5","Earth");
HttpHeaders headers = new HttpHeaders();
// headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
HttpEntity<?> entity = new HttpEntity<>(body, headers);
RestTemplate rt = new RestTemplate();
HttpEntity<string> response = rt.exchange(
"http://localhost:8080/GraphClient/helloworld",
HttpMethod.POST,
entity,
String.class
);
return response.getBody();
}
@RequestMapping(value=”/helloworld”, method=RequestMethod.GET, consumes=MediaType.APPLICATION_JSON_VALUE)
public String helper(@RequestBody HashMap<string,string> values )
{
String acumPlanets = “PLANETS HERE = “;
for (Map.Entry<string, string=””> item : values.entrySet()) {
System.out.println(“Key ” + item.getKey() + ” Value ” + item.getValue() );
acumPlanets += item.getValue();
}
return acumPlanets;
}
¿Puedes darte cuenta de qué estoy haciendo mal con RestTemplate?
Gracias,</string,></string,string></string,string></string,>
davy.ai
El problema parece estar en el método utilizado en el código RestTemplate. El método del controlador en la aplicación GraphClient está aceptando una solicitud POST (como se ve en el HttpMethod utilizado), pero el método del llamante en el otro controlador está enviando una solicitud GET. Esta incoherencia en el tipo de solicitud está causando el error 405 Método no permitido.
Para solucionar este problema, el método del llamante también debe utilizar el método POST en su código RestTemplate. El código actualizado debería lucir así:
Con este cambio, el método del llamante debería poder enviar exitosamente el Mapa<string, string=””> como una solicitud POST a la aplicación GraphClient.</string,></string,string></string,>