Як я розміщую дані JSON за допомогою CURL?


2828

Я використовую 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?

Це мій бічний PUTкод Java (я перевірив 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;
}

6
перейти за посиланням на весняні 3.2.0 запити на публікацію.
AmirHd

8
Є чудовий пост Використання Curl для тестування спеціальних мікросервісів RESTful, який охоплює це кількома прикладами.
питаu

Відповіді:


4338

Потрібно встановити тип вмісту для програми / 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 все дещо інакше. Дивіться нитку коментарів.


262
Для Windows окремі цитати навколо json не працювали, і я закінчився, уникаючи подвійних лапок. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy

37
Для мене під Windows мені потрібно було уникати цитат, використовуючи цитати в цьому форматі "{ """key1""": """value1""" }". Крім того, ця відповідь: stackoverflow.com/questions/18314796 / ...
chodorowicz

4
@chodorowicz це жахливо! Я знаю лише той синтаксис від VB!
Шон Патрік Флойд

3
У мене виникли проблеми з POST-запитами, але вирішив це з великої літери "Application / json", тому якщо ви отримаєте помилку 415, перевірте її з великої літери.
WiteCastle

5
@ostrokach вибачте, що витратили свій час. Синтаксис добре працював для мене на OSX, коли я розміщував його (не повторювався). Здогадайтесь, що це / була лише різниця платформи. Я гадаю, що обґрунтування є від людей, яким це допомогло.
Адам Таттл

564

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

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

12
Напевно, ви повинні використовувати --data-binaryопцію замість --data. Можна було б очікувати, що клієнт надсилає дані так, як є, але --dataпозбавляє CR та LF з вхідних даних.
h2stein

14
Використання cUrl з inline json Strings здається кошмаром. Існує необхідність відлякувати подвійний символ цитати. Іти з таким файлом - приємніше.
Xtreme Biker

46
Важливо додати @символ перед назвою файлу, інакше він не працюватиме. Я щойно провів 20 хвилин, стукаючи головою в цю лайно ...
Раду Мурзеа

3
Таким чином, ви також можете запустити файл JSON вказівник на файл, щоб побачити, чи є помилка в розборі JSON.
datashaman

4
У Windows вам потрібні подвійні лапки навколо назви файла "@ body.json"
Stomf

100

Вам може бути корисний відпочинок: 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 за замовчуванням


93

Для 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

5
FYI - схоже, що вам не вистачає подвійної цитати навколо тіла json
acanby

3
Для мене в Windows "навколо даних не працює, натомість жодні цитати не працюють
rodedo

3
Якщо ви використовуєте PowerShell, дивіться цю відповідь.
rsenna

86

Для мене це працювало:

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.


56

Наприклад, створіть файл 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

42

Я просто зіткнувся з тією ж проблемою. Я міг би вирішити це, вказавши

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


31

Ви можете використовувати Postman з його інтуїтивно зрозумілим графічним інтерфейсом для збирання вашої cURLкоманди.

  1. Встановити та запустити листоношу
  2. Введіть свою URL-адресу, орган публікації, заголовки запитів тощо. Pp.
  3. Натисніть на Code
  4. Виберіть cURLзі спадного списку
  5. скопіюйте та вставте свою cURLкоманду

Примітка. У спадному списку є декілька варіантів автоматизованої генерації запитів, тому я вважав, що в першу чергу потрібна моя публікація.


6
Не усвідомлював, що ця функція була включена до Поштальона. Дякуємо, що вказали на це!
ariestav

29

Спробуйте CURL Windows: Спробуйте:

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


24

HTTPie - рекомендована альтернатива curlтому, що ви можете робити просто

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

Він говорить JSON за замовчуванням і обробляє як встановлення необхідного для вас заголовка, так і кодування даних як дійсних JSON. Є також:

Some-Header:value

для заголовків та

name==value

для параметрів рядка запиту. Якщо у вас є великий фрагмент даних, ви також можете прочитати їх з файлу, якщо це буде закодовано JSON:

 field=@file.txt

20

Якщо ви протестуєте багато JSON для надсилання / відповідей на інтерфейс RESTful, ви можете перевірити плагін Postman для Chrome (який дозволяє вручну визначати тести веб-служб) та його команду Newman на основі Node.js -лінійний супутник (який дозволяє автоматизувати тести на "колекції" тестів Поштальона.) І безкоштовні, і відкриті!


18

Для мене це добре працювало, додатково використовуючи автентифікацію BASIC:

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 та перевіреного сертифіката.

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

Див. Також Введення URL-адреси з дужками для згортання .


17

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

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


10

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

use -F 'json data'

Припустимо цей формат диктанту JSON:

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

Повний приклад

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

6

Використовуйте опцію -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 'Прийняти: application / json', щоб додати заголовок типу accept

використовуйте -H 'Тип вмісту: додаток / json', щоб додати заголовок типу вмісту


Я намагався його використовувати, але отримував {"помилки": ["даних не надано"]} помилка.
Суреш

6

Це працювало для мене на Windows10

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

5

Перевірте цей інструмент . Це допомагає вам легко створювати фрагменти завитків.

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"

5

Ось ще один спосіб зробити це, якщо у вас є динамічні дані.

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"

1
Ти врятував моє життя!
Абхіманю

4

Я знаю, багато відповіли на це питання, але хотіли поділитися тим, де у мене виникло питання:

curl -X POST http: // your-server-end-point -H "Тип вмісту: application / json" -d @ path-of-your-json-file.json

Дивіться, я все зробив правильно, тільки одне - "@" я пропустив раніше шлях файлу JSON.

В Інтернеті я знайшов один відповідний перехідний документ - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

Сподіваюся, що це може допомогти небагатьом. Дякую


1

Якщо ви налаштуєте SWAGGER на свою програму весняного завантаження і викликте будь-який API зі своєї програми, ви також можете побачити цей запит CURL.

Я думаю, що це простий спосіб генерації запитів через CURL.


-6

Ви можете передати розширення потрібного формату як кінець URL-адреси. як-от http: // localhost: 8080 / xx / xxx / xxxx .json

або

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

Примітка: вам потрібно додати залежність від Джексона та Джекба Мавена у пам’яті.


4
Це буде працювати лише в тому випадку, якщо серверна сторона прийняла URL-адреси з цими розширеннями.
Марк Стосберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.