www urlencoded unsupported unexpected type there supported plain octet not httpmediatypenotsupportedexception form error content charset body application spring spring-mvc model-view-controller

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 }