es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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,>

Tags:  , , ,

Answer

  1. Avatar for 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í:

    @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();
    
        HttpEntity<?> entity = new HttpEntity<>(body, headers);
    
        RestTemplate rt = new RestTemplate();
    
        HttpEntity<string> response = rt.exchange(
                "http://localhost:8080/GraphClient/helloworld",
                HttpMethod.POST,  // Cambiar de GET a POST
                entity,
                String.class
        );
    
        return response.getBody();
    }
    

    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,>

Comments are closed.