Type de contenu 'application / x-www-form-urlencoded;charset=UTF-8' not supported for @RequestBody MultiValueMap

basé sur la réponse pour problème avec x-www-form-urlencoded avec Spring @Controller

j'ai écrit la méthode @Controller ci-dessous

@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 demande à laquelle échoue avec l'erreur ci-dessous

{
  "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"
}

[PS: Jersey a été beaucoup plus amical, mais ne pouvait pas l'utiliser maintenant, étant donné les restrictions pratiques ici]

46
demandé sur Community 2015-11-19 08:51:00

5 réponses

le problème est que lorsque nous utilisons application/x-www-form-urlencoded , Spring ne le comprend pas comme un RequestBody. Donc, si nous voulons utiliser cette nous devons supprimer l'annotation @RequestBody .

puis essayez ce qui suit:

@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;
}

Note supprimant l'annotation @RequestBody

réponse : Http Requête Post avec un type de contenu application/x-www-form-urlencoded pas de travail au Printemps

54
répondu Douglas Ribeiro 2017-05-23 11:47:14

Il semble que maintenant vous pouvez simplement marquer le paramètre de méthode avec @RequestParam et il fera le travail pour vous.

@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
  //work with Map
}
33
répondu Scadge 2018-01-15 10:21:34

Ajouter un en-tête à votre requête pour définir le type de contenu à application /json

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

de cette façon spring sait comment analyser le contenu.

9
répondu Agustin Almonte 2016-07-11 15:16:05

j'ai écrit au sujet d'une alternative dans cette réponse de débordement de piles .

là j'ai écrit étape par étape, en expliquant avec le code. Le chemin court:

Première : écrire un objet

Deuxième : créer un convertisseur de cartographie le modèle de l'extension de la AbstractHttpMessageConverter

troisième : dire au ressort d'utiliser ce convertisseur implémentant un WebMvcConfigurer.dépassement de classe de la méthode configureMessageConverters

Quatrième et final: l'utilisation de ce cadre de mise en œuvre de la cartographie à l'intérieur de votre contrôleur de l'consomme = MediaType.APPLICATION_FORM_URLENCODED_VALUE et @RequestBody devant votre objet.

j'utilise la botte de printemps 2.

1
répondu Marco Blos 2018-07-03 18:20:29

ma solution avec Alamofire sur swift 3

Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON 
-2
répondu Zhanserik 2017-09-04 08:44:29