На основе ответа на проблему с x-www-form-urlencoded с помощью Spring @Controller
Я написал метод @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": "/users/usermail%40gmail.com/authenticate"
}
[PS: Джерси был гораздо более дружелюбным, но сейчас не мог его использовать из-за практических ограничений]
spring
spring-mvc
model-view-controller
Сомасундарам Секар
источник
источник
JSON.stringify({"ordersToDownload":"00417002"}
$.ajax({url:"/myurl", type:"POST", data: JSON.stringify({"someAttribute":"someData"}) })
Ответы:
Проблема в том, что когда мы используем 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 с типом содержимого application / x-www-form-urlencoded не работает в Spring
источник
application/x-www-form-urlencoded
?@ModelAttribute, even though this behaviour is (sadly) not documented. And
неаннотированные аргументы, как если бы у них есть @ModelAttribute, действительно понимающий x-www-form-urlencodedКажется, теперь вы можете просто пометить параметр метода,
@RequestParam
и он сделает всю работу за вас.@PostMapping( "some/request/path" ) public void someControllerMethod( @RequestParam Map<String, String> body ) { //work with Map }
источник
Добавьте заголовок в свой запрос, чтобы установить тип содержимого как application / json
curl -H 'Content-Type: application/json' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY
таким образом Spring знает, как анализировать контент.
источник
Весной 5
@PostMapping( "some/request/path" ) public void someControllerMethod( @RequestParam MultiValueMap body ) { // import org.springframework.util.MultiValueMap; String datax = (String) body .getFirst("datax"); }
источник
Простое удаление
@RequestBody
аннотации решает проблему (проверено на Spring Boot 2):@RestController public class MyController { @PostMapping public void method(@Valid RequestDto dto) { // method body ... } }
источник
Я писал об альтернативе в этом ответе на StackOverflow .
Там я писал пошагово, объясняя кодом. Краткий путь:
Во-первых : напишите объект
Во-вторых : создайте конвертер для отображения модели, расширяющей AbstractHttpMessageConverter
Третье : скажите Spring использовать этот конвертер, реализующий WebMvcConfigurer.class, переопределяющий метод configureMessageConverters
Четвертое и последнее: используя этот параметр реализации в сопоставлении внутри вашего контроллера, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE и @RequestBody перед вашим объектом.
Я использую пружинный ботинок 2.
источник
@PostMapping(path = "/my/endpoint", consumes = { MediaType.APPLICATION_FORM_URLENCODED_VALUE }) public ResponseEntity<Void> handleBrowserSubmissions(MyDTO dto) throws Exception { ... }
Этот способ работает для меня
источник