У меня проблема с обработкой параметров из запроса curl в мое приложение с весенней загрузкой.
Мой метод публикации контроллера:
@RequestMapping(value = "/cat", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity addCat(@Valid @ModelAttribute NewCatRequest newCatRequest, BindingResult bindingResult) {
System.out.println( newCatRequest);
if (bindingResult.hasErrors()) {
return ResponseEntity.badRequest().body(bindingResult.getFieldError().getDefaultMessage());
}
int rowsAffected = catsRepository.saveCat(newCatRequest.getName(), newCatRequest.getColor(), newCatRequest.getTail_length(), newCatRequest.getWhiskers_length());
if (rowsAffected == 1) {
return ResponseEntity.ok().body(newCatRequest);
} else {
return ResponseEntity.badRequest().body("There was an unexpected error while trying to create cat for you :(");
}
}
И проблема в том, что когда я пытаюсь отправить это с помощью curl:
curl -X POST http://localhost:8080/cat \ -d "{\"name\": \"Tihon\", \"color\": \"red & white\", \"tail_length\": 15, \"whiskers_length\": 12}"
У меня есть все нулевые параметры в 'newCatRequest': NewCatRequest{name='null', color='null', tail_length=0, whiskers_length=0}
НО, когда я пытаюсь сделать то же самое с Postman (метод POST, x-www-form-urlencoded в теле с моими параметрами), у меня есть правильный результат: Результат от почтальона
Помогите пожалуйста понять в чем проблема.




вы можете использовать опцию кода ниже кнопки отправки в почтальоне, чтобы сгенерировать точный запрос на завивание, который будет работать для вас https://i.stack.imgur.com/hbk8M.png в раскрывающемся меню кода найдите curl, и он сгенерирует для вас аккуратный и чистый запрос на завиток. Надеюсь это поможет
Попробуй это:
curl -X POST \
http://localhost:8080/cat \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'name=Thidon&color=red%20%26%20white&tail_length=15&whiskers_length=12'
Вы забыли заголовок application/x-www-form-urlencodedи тело не должно быть в формате json.
curl -X POST http://localhost:8080/cat \
-d "{\"name\": \"Tihon\", \"color\": \"red & white\", \"tail_length\": 15, \"whiskers_length\": 12}"
Приведенный выше запрос curl имеет тело JSON, тогда как ваш метод обработки запроса
@RequestMapping(value = "/cat", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
потребляет/принимает: application/x-www-form-urlencoded. Поэтому вы должны либо преобразовать свой метод в потребление/принятие application/json, либо изменить свой запрос curl на:
curl -X POST http://localhost:8080/cat \
-d 'name=Tihon&color=red%20%26%20white&tail_length=15&whiskers_length= 12' \
-H 'Content-Type: application/x-www-form-urlencoded'
РЕДАКТИРОВАТЬ 1
Обратите внимание, что Тип содержимого по умолчанию для завиток — application/x-www-form-urlencoded. Чтобы использовать JSON, измените свой запрос на:
curl -X POST http://localhost:8080/cat \
-d "{\"name\": \"Tihon\", \"color\": \"red & white\", \"tail_length\": 15, \"whiskers_length\": 12}" \
-H 'Content-Type: application/json'
И даже если я добавлю -H 'Content-Type: application/json' в запрос curl и потребляет = MediaType.APPLICATION_JSON_VALUE в моем контроллере - у меня та же проблема (пустые поля NewCatRequest{name='null', color='null ', длина_хвоста=0, длина_усов=0)
Мне помогло добавление RequestBody после аннотации Valid. Также я сохраняю MediaType как application/json/. И проблема с запросом curl без указания типа контента в заголовке была связана с тем, что по умолчанию для типа контента установлено значение x-www-form-urlecoded. Спасибо большое.
После изменения MediaType на MediaType.Application_JSON_VALUE мой контроллер сказал мне, что Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: тип контента «application/x-www-form-urlencoded» не поддерживается]. Присланный завиток на этот раз был таким же, как и в моем первом вопросе