Как я могу получить параметры весной из запроса curl -X?

У меня проблема с обработкой параметров из запроса 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 в теле с моими параметрами), у меня есть правильный результат: Результат от почтальона

Помогите пожалуйста понять в чем проблема.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
810
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете использовать опцию кода ниже кнопки отправки в почтальоне, чтобы сгенерировать точный запрос на завивание, который будет работать для вас 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'

После изменения MediaType на MediaType.Application_JSON_VALUE мой контроллер сказал мне, что Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: тип контента «application/x-www-form-urlencoded» не поддерживается]. Присланный завиток на этот раз был таким же, как и в моем первом вопросе

Victor Buryak 27.02.2019 08:18

И даже если я добавлю -H 'Content-Type: application/json' в запрос curl и потребляет = MediaType.APPLICATION_JSON_VALUE в моем контроллере - у меня та же проблема (пустые поля NewCatRequest{name='null', color='null ', длина_хвоста=0, длина_усов=0)

Victor Buryak 27.02.2019 08:30

Мне помогло добавление RequestBody после аннотации Valid. Также я сохраняю MediaType как application/json/. И проблема с запросом curl без указания типа контента в заголовке была связана с тем, что по умолчанию для типа контента установлено значение x-www-form-urlecoded. Спасибо большое.

Victor Buryak 27.02.2019 09:24

Другие вопросы по теме