type - spring boot index html



Tipo de conteúdo 'application/x-www-form-urlencoded; charset=UTF-8' não suportado para @RequestBody MultiValueMap (4)

Com base na resposta para o problema com x-www-form-urlencoded com Spring @Controller

Eu escrevi o método @Controller abaixo

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

a solicitação para a qual falha com o erro abaixo

{
  "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 era muito mais amigável, mas não podia usá-lo agora, dadas as restrições práticas aqui]

https://src-bin.com


Answer #1

Adicione um cabeçalho à sua solicitação para definir o tipo de conteúdo para application / json

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

Desta forma, a primavera sabe como analisar o conteúdo.


Answer #2

Em vez de usar um mapa, você pode usar os parâmetros diretamente:

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

Answer #3

Na primavera 5

@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam MultiValueMap body ) {

    // import org.springframework.util.MultiValueMap;

    String datax = (String) body .getFirst("datax");
}

Answer #4

O problema é que, quando usamos application / x-www-form-urlencoded , o Spring não o entende como um RequestBody. Então, se quisermos usar isso, devemos remover a anotação @RequestBody .

Então tente o seguinte:

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

Observe que removeu a anotação @RequestBody

resposta : Http Pós-pedido com o tipo de conteúdo application / x-www-form-urlencoded não funciona na Primavera





model-view-controller