El tipo de contenido ‘application / x-www-form-urlencoded; charset = UTF-8’ no es compatible con @RequestBody MultiValueMap

Basado en la respuesta al 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 cual 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 fue mucho más amigable, pero no podía usarlo ahora dadas las restricciones prácticas aquí]

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 solicitud con tipo de contenido application / x-www-form-urlencoded no funciona en Spring

Parece que ahora puede marcar el parámetro del método con @RequestParam y lo hará por usted.

 @PostMapping( "some/request/path" ) public void someControllerMethod( @RequestParam Map body ) { //work with Map } 

Agregue un encabezado a su solicitud para establecer el tipo de contenido a la aplicación / json

 curl -H 'Content-Type: application/json' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY 

de esta manera, la spring sabe cómo analizar el contenido.

Escribí sobre una alternativa en esta respuesta de StackOverflow .

Allí escribí paso a paso, explicando con código. La manera corta:

Primero : escribe un objeto

Segundo : cree un convertidor para mapear el modelo extendiendo AbstractHttpMessageConverter

Tercero : dile a la spring que uses este convertidor implementando una clase WebMvcConfigurer.class que anule el método configureMessageConverters

Cuarto y último: utilizando esta configuración de implementación en la asignación dentro de su controlador, consume = MediaType.APPLICATION_FORM_URLENCODED_VALUE y @RequestBody en frente de su objeto.

Estoy usando la bota de spring 2.

Mi solución con Alamofire en swift 3

 Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON