2015-11-19 13 views
28

Sulla base della risposta for problem with x-www-form-urlencoded with Spring @ControllerTipo di contenuto 'application/x-www-form-urlencoded; charset = UTF-8' non supportato per @RequestBody MultiValueMap

ho scritto il seguito metodo @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 richiesta a cui non riesce con l'errore sotto

{ 
    "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": "https://stackoverflow.com/users/usermail%40gmail.com/authenticate" 
} 

[PS: Jersey era molto più gentile, ma non ha potuto usarlo ora date le restrizioni pratiche qui]

+0

Forse si aggiunge consuma = { "application/x-www-form-urlencoded"} in @RequestBody? – shiladitya

+1

Come hai eseguito la richiesta? aggiungi il codice di (js, jquery, arricciatura o qualsiasi altra cosa tu usi). –

+0

Ho lo stesso problema. Nel mio caso uso jquery ajax per pubblicare i dati e il dato è 'JSON.stringify ({" ordersToDownload ":" 00417002 "}' – Arashsoft

risposta

33

Il problema è che quando usiamo application/x-www-form-urlencoded, Spring non lo capisce come RequestBody. Quindi, se vogliamo utilizzare questo , dobbiamo rimuovere l'annotazione @RequestBody.

Quindi provare la seguente:

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

Nota che ha rimosso l'annotazione @RequestBody

risposta: Http Post request with content type application/x-www-form-urlencoded not working in Spring

+0

Grazie! Risolve il problema Ora mi chiedo come rimuovere esplicitamente 'application/x-www-form-urlencoded'? –

6

aggiungere un'intestazione alla vostra richiesta per impostare il tipo di contenuto a richiesta/json

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

in questo modo la primavera sa come analizzare il contenuto.

+0

Questo è un modo molto migliore, perché non è necessario modificare il codice REST-Controller ! Grazie! – jonashackt

+0

Potrebbe essere necessario aggiungere anche un'intestazione Accept al comando: 'curl -vk -H "Accetta: application/json" -H "Content-Type: application/json"' ecc. – razvanone

+0

puoi spiegare come per aggiungere questa impostazione al mio modulo HTML? –

21

Sembra che ora puoi semplicemente contrassegnare il parametro metodo con @RequestParam e farà il lavoro per te.

@PostMapping("some/request/path") 
public void someControllerMethod(@RequestParam Map<String, String> body) { 
    //work with Map 
} 
+0

Proverò quando ne avrò la possibilità –

+0

Questo funziona come un fascino – Clijsters

+0

ha fatto il trucco per me! L'approccio MultiValueMap no. –

-2

La mia soluzione con Alamofire sul swift 3

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