20 Вопрос: Как мне отправить данные JSON с помощью Curl из терминала / командной строки в Test Spring REST?

вопрос создан в Mon, Jun 24, 2019 12:00 AM

Я использую 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;
}
    
2465
  1. извлеките ссылка для запросов на публикацию весной 3.2.0.
    2013-06-05 09: 41: 10Z
  2. Есть хороший пост Использование Curl для специального тестирования RESTful Microservices , которое покрывает это несколькими примерами.
    2016-08-28 11: 03: 03Z
20 ответов                              20                         

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

    
3854
2018-05-03 21: 43: 03Z
  1. Я удалил параметр -d из команды, но все тот же.
    2011-08-24 09: 42: 19Z
  2. Для окон одинарные кавычки вокруг json не работали, и в итоге я избежал двойных кавычек. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
    2013-09-11 17: 34: 40Z
  3. Для меня в Windows мне нужно было избегать кавычек, используя кавычки в этом формате "{ """key1""": """value1""" }". Также этот ответ: stackoverflow.com/questions/18314796/…
    2014-01-27 11: 10: 59Z
  4. @ chodorowicz это ужасно! Я знаю только этот синтаксис из VB!
    2014-01-27 12: 42: 55Z
  5. @ ostrokach извините, это потеряло ваше время. Синтаксис работал нормально для меня на OSX, когда я опубликовал его (не повторил). Думаю, это было /было просто разница платформы. Я полагаю, что от людей, которым это помогло, были положительные отзывы.
    2015-11-01 01: 23: 23Z

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

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
    
493
2011-08-24 10: 04: 24Z
  1. Возвращает ошибку 404
    2011-08-24 10: 22: 59Z
  2. Возможно, вам следует использовать опцию --data-binary вместо --data. Можно ожидать, что клиент отправляет данные как есть, но --data удаляет CR и LF из входных данных.
    2014-03-24 08: 22: 40Z
  3. Использование cUrl со встроенными json-строками кажется кошмаром. Есть необходимость отбросить символ двойной кавычки. Работать с таким файлом лучше.
    2014-06-26 10: 26: 41Z
  4. Важно добавить символ @ перед именем файла, иначе он не будет работать. Я просто потратил 20 минут, стуча головой по этому дерьму ...
    2015-08-18 11: 41: 09Z
  5. Я собирался поднять этот ответ, но его текущий счет составляет 404…
    2018-05-30 16: 57: 49Z

Вам может пригодиться отдых: 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
2013-02-08 14: 34: 39Z

В 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
2017-05-27 21: 51: 04Z
  1. FYI - похоже, вам не хватает закрывающей двойной кавычки вокруг тела json
    2016-03-14 23: 10: 46Z
  2. Для меня в Windows «вокруг данных не работает, вместо них не работают кавычки
    2016-10-17 09: 44: 11Z
  3. Если вы используете PowerShell, см. этот ответ.
    2018-02-28 19: 02: 52Z

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

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
2017-05-27 21: 47: 50Z

Например, создайте файл 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
2018-01-22 16: 05: 09Z

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

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

Где

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

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

    
34
2015-07-01 14: 31: 40Z
  1. В этом примере -X POST является избыточным
    2018-01-22 16: 05: 45Z

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

-H "Content-Type: application/json; charset=UTF-8"
    
31
2011-11-15 15: 45: 09Z

Используя 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
2015-03-12 11: 37: 54Z

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

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

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

    
23
2017-09-25 12: 47: 20Z
  1. Не знал, что эта функция была включена в Почтальон. Спасибо за указание на это!
    2019-03-05 16: 31: 57Z

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

    
17
2017-02-14 21: 40: 23Z

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

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

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

Some-Header:value

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

name==value

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

 field=@file.txt
    
15
2018-08-23 14: 13: 44Z

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

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
2017-05-27 21: 49: 25Z

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

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
    
14
2019-03-23 ​​11: 41: 52Z

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

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
    
13
2016-10-16 16: 39: 51Z

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

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
2017-05-27 21: 50: 02Z

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

 введите описание изображения здесь

    
3
2019-05-30 06: 43: 36Z
  1. Большое спасибо @ forever-LA для меня это был совет по спасению жизни
    2019-06-17 09: 37: 22Z

Используйте параметр -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
2019-04-13 20: 06: 36Z

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

curl -XGET -H "Accept: application/json" -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"
    
- 1
2019-05-27 12: 35: 04Z

Вы можете передать расширение нужного формата в качестве конца URL. например, http: //localhost: 8080 /xx /xxx /xxxx .json р>

или р>

http: //localhost: 8080 /xx /xxx /xxxx . XML

Примечание: вам нужно добавить в ваш pom зависимости Джексона и jaxb maven.

    

- 6
2018-07-16 09: 57: 33Z
  1. Это будет работать только в том случае, если на стороне сервера будут приняты URL-адреса с этими расширениями.
    2018-08-23 14: 01: 31Z
  2. Правильно, это будет работать на стороне сервера.
    2018-10-12 07: 59: 12Z
источник размещен Вот