it-roy-ru.com

Как мне POST данные JSON с Curl из терминала / командной строки для тестирования Spring REST?

Я использую 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

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

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

Журнал Tomcat: "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;
}
2461
kamaci

Вам необходимо установить тип контента для 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 все немного по-другому. Смотрите ветку комментариев.

3848
Sean Patrick Floyd

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

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
491
Typisch

Вам может пригодиться отдых: 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 по умолчанию

90
mo-seph

В 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
venkatnz

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

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.

76
Luis

Например, создайте файл 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
47
Eduardo Cerqueira

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

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

Куда,

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

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

34
felipealves.gnu

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

-H "Content-Type: application/json; charset=UTF-8"
31
Steffen Roller

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

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-Host/_ah/api/employeeendpoint/v1/employee
26
Márcio Brener

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

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

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

23
kiltek

Если вы тестируете много JSON-рассылок/ответов по интерфейсу RESTful, вы можете попробовать подключаемый модуль Почтальон для Chrome (который позволяет вручную определять тесты веб-службы) и его Node.js Newman компаньон командной строки (который позволяет автоматизировать тесты для "коллекций" тестов Postman.) И бесплатно, и открыто!

17
ftexperts

HTTPie является рекомендуемой альтернативой curl, потому что вы можете просто

$ http POST http://example.com/some/endpoint name=value name1=value1

По умолчанию он говорит на JSON и будет обрабатывать как установку необходимого вам заголовка, так и кодирование данных в качестве допустимого JSON. Существует также:

Some-Header:value

для заголовков и

name==value

для параметров строки запроса. Если у вас большой кусок данных, вы также можете прочитать его из файла, если он будет закодирован в JSON:

 [email protected]
15
tosh

Вы также можете поместить содержимое JSON в файл и передать его в curl с помощью параметра --file-upload через стандартный ввод, например:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
14
iloveretards

Это работало хорошо для меня, дополнительно используя базовую аутентификацию:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"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://httpbin.org/post

Конечно, вы никогда не должны использовать BASIC-аутентификацию без SSL и проверенного сертификата.

Сегодня я столкнулся с этим снова, используя Cygwin cURL 7.49.1 для Windows ... И при использовании --data или --data-binary с аргументом JSON cURL запутался и интерпретировал {} в JSON как шаблон URL. Исправлено добавление аргумента -g для отключения подстановки cURL.

Смотрите также Передача URL с скобками в curl.

14
davenpcj

Это сработало для меня:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
13
Amit Vujic

Я использую приведенный ниже формат для тестирования с веб-сервером.

use -F 'json data'

Давайте предположим, что этот формат JSON dict:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

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

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
7
user3180641

Вы можете использовать почтальон для конвертации в CURL enter image description here

enter image description here

3
forever LA

Используйте опцию -d для добавления полезной нагрузки

curl -X POST \
http://<Host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

К тому же:

используйте -X POST, чтобы использовать метод POST

используйте -H 'Accept: application/json', чтобы добавить заголовок типа принятия

используйте -H 'Content-Type: application/json', чтобы добавить заголовок типа контента

0
Sma Ma