Как мне отправить данные JSON с помощью Curl из терминала / командной строки в Test Spring REST? - PullRequest
2488 голосов
/ 24 августа 2011

Я использую Ubuntu и установил cURL на него.Я хочу проверить мое приложение Spring REST с помощью cURL.Я написал свой POST-код на стороне Java.Тем не менее, я хочу проверить это с помощью cURL.Я пытаюсь опубликовать данные в формате JSON.Пример данных выглядит так:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

Я использую эту команду:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

Возвращает эту ошибку:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

Описание ошибки:

Сервер отклонил этот запрос, поскольку объект запроса находится в формате, не поддерживаемом запрошенным ресурсом для запрошенного метода ().

Tomcatlog: «POST / ui / webapp / conf / clear HTTP / 1.1» 415 1051

Какой правильный формат команды cURL?

Это мой код на стороне Java PUT (Я проверил GET и DELETE, и они работают):

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}

Ответы [ 21 ]

3887 голосов
/ 24 августа 2011

Вам необходимо установить тип контента для application / json.Но -d отправляет Content-Type application/x-www-form-urlencoded, который не принят со стороны Spring.

Глядя на справочную страницу curl , я думаю, вы можетеиспользуйте -H:

-H "Content-Type: application/json"

Полный пример:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

(-H - это сокращение от --header, -d для --data)

Обратите внимание, что -request POST является необязательным , если вы используете -d, так как флаг -d подразумевает запрос POST.


В Windows,все немного по-другому.Смотрите ветку комментариев.

498 голосов
/ 24 августа 2011

Попробуйте поместить данные в файл, скажем body.json, а затем используйте

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
91 голосов
/ 12 января 2012

Вам может пригодиться отдых: https://github.com/micha/resty

Это оболочка CURL, которая упрощает запросы REST командной строки. Вы указываете это на свою конечную точку API, и она дает вам команды PUT и POST. (Примеры адаптированы с домашней страницы)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

Кроме того, часто все еще необходимо добавлять заголовки типа контента. Однако вы можете сделать это один раз, чтобы установить значение по умолчанию для добавления файлов конфигурации для каждого метода для каждого сайта: Настройка параметров RESTY по умолчанию

79 голосов
/ 01 июля 2014

Для Windows использование одинарной кавычки для значения -d не сработало, но сработало после перехода на двойную кавычку. Также мне нужно было избегать двойных кавычек в фигурных скобках.

То есть не сработало следующее:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

Но сработало следующее:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
77 голосов
/ 19 апреля 2012

Это сработало для меня, используя:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

Он был успешно сопоставлен с контроллером Spring:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnly - это простое POJO ссвойство id.

48 голосов
/ 06 января 2016

Например, создайте файл JSON, params.json, и добавьте в него следующее содержимое:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

Затем вы запускаете эту команду:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server
34 голосов
/ 01 июля 2015

Это хорошо сработало для меня.

curl -X POST --data @json_out.txt http://localhost:8080/

Где,

-X Означает глагол http.

--data Означает данные, которые вы хотите отправить.

31 голосов
/ 15 ноября 2011

Я просто столкнулся с той же проблемой.Я мог бы решить это, указав

-H "Content-Type: application/json; charset=UTF-8"
26 голосов
/ 21 декабря 2014

Используя CURL Windows, попробуйте это:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
23 голосов
/ 25 сентября 2017

Вы можете использовать Почтальон с его интуитивно понятным графическим интерфейсом для сборки команды cURL.

  1. Установка и запуск Почтальон
  2. Введите свой URL, текст сообщения, заголовки запроса и т. Д.
  3. Нажмите Code
  4. Выберите cURL из раскрывающегося списка
  5. копировать и вставитьваша cURL команда

Примечание. В раскрывающемся списке есть несколько вариантов автоматической генерации запроса, поэтому я решил, что мой пост был необходим в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...