unsupported - spring rest x www form urlencoded
El tipo de contenido ''application/x-www-form-urlencoded; charset=UTF-8'' no es compatible con @RequestBody MultiValueMap (6)
Basado en la respuesta para el problema con x-www-form-urlencoded con Spring @Controller
He escrito el siguiente método @Controller
@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST
, produces = {"application/json", "application/xml"}
, consumes = {"application/x-www-form-urlencoded"}
)
public
@ResponseBody
Representation authenticate(@PathVariable("email") String anEmailAddress,
@RequestBody MultiValueMap paramMap)
throws Exception {
if(paramMap == null || paramMap.get("password") == null) {
throw new IllegalArgumentException("Password not provided");
}
}
la solicitud a la que falla con el siguiente error
{
"timestamp": 1447911866786,
"status": 415,
"error": "Unsupported Media Type",
"exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
"message": "Content type ''application/x-www-form-urlencoded;charset=UTF-8'' not supported",
"path": "/users/usermail%40gmail.com/authenticate"
}
[PD: Jersey era mucho más amigable, pero no podía usarlo ahora dadas las restricciones prácticas aquí]
Agregue un encabezado a su solicitud para establecer el tipo de contenido en application / json
curl -H ''Content-Type: application/json'' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY
de esta manera, spring sabe cómo analizar el contenido.
El problema es que cuando usamos application / x-www-form-urlencoded , Spring no lo entiende como RequestBody. Entonces, si queremos usar esto, debemos eliminar la anotación @RequestBody .
Luego intente lo siguiente:
@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public @ResponseBody Representation authenticate(@PathVariable("email") String anEmailAddress, MultiValueMap paramMap) throws Exception {
if(paramMap == null && paramMap.get("password") == null) {
throw new IllegalArgumentException("Password not provided");
}
return null;
}
Tenga en cuenta que eliminó la anotación @RequestBody
respuesta : Http Post request con tipo de contenido application / x-www-form-urlencoded no funciona en Spring
En la primavera 5
@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam MultiValueMap body ) {
// import org.springframework.util.MultiValueMap;
String datax = (String) body .getFirst("datax");
}
En lugar de usar un Mapa, puede usar los parámetros directamente:
@RequestMapping(method = RequestMethod.POST, value = "/event/register")
@ResponseStatus(value = HttpStatus.OK)
public void registerUser(@RequestParam(name = EVENT_ID) String eventId,
@RequestParam(name = ATTENDEE_ID) String attendeeId,
@RequestParam(name = SCENARIO) String scenario) {
log.info("Register user: eventid: {}, attendeeid: {}, scenario: {} ", eventId,attendeeId,scenario);
//more code here
}
Escribí sobre una alternativa en esta respuesta de .
Allí escribí paso a paso, explicando con código. El camino corto:
Primero : escribe un objeto
Segundo : cree un convertidor para mapear el modelo extendiendo AbstractHttpMessageConverter
Tercero : dígale a Spring que use este convertidor implementando una clase WebMvcConfigurer.sobre el método configureMessageConverters
Cuarto y último: usando esta configuración de implementación en la asignación dentro de su controlador, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE y @RequestBody frente a su objeto.
Estoy usando spring boot 2.
Parece que ahora puede marcar el parámetro del método con
@RequestParam
y hará el trabajo por usted.
@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
//work with Map
}