2015-11-19 1 views
28

На основании ответа for problem with x-www-form-urlencoded with Spring @ControllerТип содержимого 'применение/х-WWW-форм-urlencoded; кодировка = UTF-8' не поддерживается для @RequestBody MultiValueMap

я написал ниже метод @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"); 
      } 
    } 

запрос, на который завершается с ошибкой ниже

{ 
    "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: Джерси было гораздо более дружелюбным, но не может использовать его в настоящее время с учетом практических ограничений здесь]

+0

Вы добавили истребляют = { "применение/X-WWW-форм-urlencoded"} в @RequestBody? – shiladitya

+1

Как вы выполнили запрос? добавьте код (js, jquery, curl или все, что вы используете). –

+0

У меня такая же проблема. В моем случае я использую jquery ajax для публикации данных, а данные - 'JSON.stringify ({" ordersToDownload ":" 00417002 "}' – Arashsoft

ответ

33

Проблема в том, что когда мы используем application/x-www-form-urlencoded, Spring не понимает его как RequestBody. Итак, если мы хотим использовать этот , мы должны удалить аннотацию @RequestBody.

Тогда попробуйте следующее:

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

Обратите внимание, что удалить аннотацию @RequestBody

ответ: Http Post request with content type application/x-www-form-urlencoded not working in Spring

+0

Спасибо, решает проблему. Теперь мне интересно, как мы явно удаляем «application/x-www-form-urlencoded»? –

6

Добавить заголовок на запрос, чтобы установить тип содержимого для приложения/json

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

таким образом, пружина умеет разбирать содержимое.

+0

Это намного лучший способ, потому что вам не нужно менять код REST-Controller ! Спасибо! – jonashackt

+0

Возможно, вам также потребуется добавить заголовок Accept в свою команду: «curl -vk -H» Accept: application/json «-H» Content-Type: application/json »и т. Д. – razvanone

+0

не могли бы вы объяснить, как добавить этот параметр в мою HTML-форму? –

21

Кажется, что теперь вы можете просто отметить параметр метода @RequestParam, и он выполнит эту работу за вас.

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

Попробуй, когда я получу шанс –

+0

Это работает как шарм – Clijsters

+0

Сделал трюк для меня! Подход MultiValueMap не сделал. –

-2

Мое решение с Alamofire на swift 3

Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON 
Смежные вопросы