Как отправить данные 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?
РЕДАКТИРОВАТЬ:
Это мой код 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;
}
37 ответов
Вам необходимо установить тип контента на application/json. Но -d
отправляет Content-Type application/x-www-form-urlencoded
, что не принято на стороне весны.
Глядя на справочную страницу 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 все немного по-другому. Смотрите ветку комментариев.
Попробуй поместить свои данные в файл, скажем body.json
а затем использовать
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
Для 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
Вам может пригодиться отдых: 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 по умолчанию
Это сработало для меня, используя:
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
Например, создайте файл 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
Я просто столкнулся с той же проблемой. Я мог бы решить это, указав
-H "Content-Type: application/json; charset=UTF-8"
Это хорошо сработало для меня.
curl -X POST --data @json_out.txt http://localhost:8080/
Куда,
-X
Означает глагол http.
--data
Означает данные, которые вы хотите отправить.
Вы можете использовать Postman с интуитивно понятным графическим интерфейсом для сборки cURL
команда.
- Установить и запустить почтальон
- Введите свой URL, текст сообщения, заголовки запроса и т. П.
- Нажмите на
Code
- Выбрать
cURL
из выпадающего списка - скопировать и вставить свой
cURL
команда
Примечание. В раскрывающемся списке есть несколько вариантов автоматической генерации запросов, поэтому я решил, что мой пост был необходим в первую очередь.
TL;DR:
Используй святую троицу,++(или жеfx
):
Это покроет необходимые заголовки, которые отсутствовали: нет необходимости явно определять заголовки и .
Новый способ curl с --json
В начале марта 2022 г. выпускается новый параметр командной строки .
--json
с версией 7.82.0. Это позволяет использовать ярлык для отправки через JSON и устраняет необходимость определять
Content-Type
что вам не хватало и
Accept
заголовки, поскольку они автоматически предполагаются, что снижает риск ошибок:
curl --json '{"tool": "curl"}' https://example.com/
Но подождите... есть еще. Вместо того, чтобы определять параметр json как строку для командной строки, используйте отличный инструмент CLI, чтобы определить JSON как серию пар ключ-значение и направить вывод через curl. Используя только для определения вашего JSON, он работает следующим образом:
> jo -p 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
{
"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
ваша команда, но без дополнительных заголовков и с использованием
jo
+ для хорошего вывода:
jo value=30 type="Tip 3" targetModule="Target 3" configurationGroup=null name="Configuration Deneme 3" description=null identity="Configuration Deneme 3" | \
curl --json @- \
-X POST \
http://localhost:8080/xx/xxx/xxxx \
jq
Пример с бесплатным API
Использование бесплатного (но ограниченного) API для демонстрации:
> jo name=Grogu gender=male email=frog.menace@jedi.edu status=active | \
curl --json @- \
-H $env:GOREST_TOKEN \
-XPATCH "https://gorest.co.in/public/v2/users/1138" | \
jq
Вывод имеет красивый формат благодаря
jq
:
{
"email": "frog.menace@jedi.edu",
"name": "Grogu",
"gender": "male",
"status": "active",
"id": 1138
}
HTTPie является рекомендуемой альтернативой curl
потому что вы можете сделать только
$ http POST http://example.com/some/endpoint name=value name1=value1
По умолчанию он говорит на JSON и будет обрабатывать как установку необходимого вам заголовка, так и кодирование данных в качестве допустимого JSON. Существует также:
Some-Header:value
для заголовков и
name==value
для параметров строки запроса. Если у вас большой кусок данных, вы также можете прочитать его из файла, если он будет закодирован в JSON:
field=@file.txt
Используя CURL Windows, попробуйте это:
curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
Используйте опцию -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', чтобы добавить заголовок типа контента
Если вы тестируете много JSON-сообщений / ответов на интерфейс RESTful, вы можете попробовать подключаемый модуль Postman для Chrome (который позволяет вручную определять тесты веб-служб) и его команду Newman на основе Node.js. -линейный компаньон (который позволяет автоматизировать тесты по "коллекциям" тестов Почтальона.) И бесплатно, и открыто!
Это работало хорошо для меня, дополнительно используя базовую аутентификацию:
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 globbing исправил это.
Смотрите также Передача URL в квадратных скобках для скручивания.
Немного опоздал на вечеринку, но я не вижу, чтобы это было опубликовано, поэтому здесь вы также можете поместить свой json в файл и передать его в curl, используя опцию --file-upload через стандартный ввод, например так:
echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
Это сработало для меня:
curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
Я знаю, что на этот вопрос было много ответов, но я хотел бы рассказать, где у меня возникла проблема:
curl -X POST http://your-server-end-point/ -H "Content-Type: application/json" -d @path-of-your-json-file.json
Видите, я все сделал правильно. Только одно - "@" я пропустил перед путем к файлу JSON.
Я нашел один соответствующий документ в Интернете - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58
Надеюсь, это поможет немногим. Спасибо
Вот еще один способ сделать это, если у вас есть динамические данные, которые будут включены.
#!/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"
Я использую приведенный ниже формат для тестирования с веб-сервером.
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"}'
This worked for me for windows10
curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X PUT http://localhost:8080/api/changeowner/CAR4
Пожалуйста, проверьте этот инструмент. Это поможет вам легко создавать фрагменты скручивания.
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"
Для PowerShell я использовал:
curl.exe -H "Content-Type: application/json" --data "@content.json" http://localhost:8080/appname/path
Где content.json - это имя json-файла на моем локальном компьютере, содержащего запрос, а
curl.exe
вместо просто
curl
не использовать псевдоним для Invoke-WebRequest.
Для данных JSON
curl -H "Content-Type: application/json" -X POST -d '{"params1":"value1","param2":"value2"}' http://localhost:8080/api
Если вы хотите опубликовать какой-нибудь файл
curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload --insecure
Если вы не хотите связываться с https и http:
ИЛИ просто
curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload
Если вы настроите SWAGGER для приложения весенней загрузки и вызовете любой API из своего приложения, вы также сможете увидеть этот запрос CURL.
Я думаю, что это простой способ генерации запросов через CURL.
--json <data>
Отправляет указанные данные JSON в запросе POST на HTTP-сервер.
завиток 7.82.0+
# Send a basic JSON object
curl --json '{"name":"xyz","breed":"xyz","age":100}' http://127.0.0.1:3000/cats
# letter @, read the data from a file
curl --json @cat.txt http://127.0.0.1:3000/cats
# letter -, read the data from stdin
echo '{"name":"xyz","breed":"xyz","age":100}' | curl --json @- http://127.0.0.1:3000/cats
завиток 7.82.0-
curl -X POST --header "Content-Type: application/json" --data '{"name":"xyz","breed":"xyz","age":100}' http://127.0.0.1:3000/cats
Я использую JSON в своем приложении, и это просто:
curl -X POST -H "Content-Type:application/json" -d '{"params1":"value1","params2":"value2"} hostname:port/api
Но если у вас есть большое количество параметров, всегда предпочитайте использовать файл с телом запроса JSON, как показано ниже:
curl -X POST -H "Content-Type:application/json" -F "data=@/users/suchi/dekstop/JSON_request.txt" hostname:port/api
ВЫПУСК ЗДЕСЬ
HTTP/1.1 415 Unsupported Media Type
Вход на сервер не может интерпретировать тип носителя этого запроса, поэтому он анализирует его как text/html.
Тип носителя любого ресурса объявляется в свойстве Content-Type заголовка запроса.
"принять"... заголовок не выполнит этот запрос, поэтому для отправки любого запроса JSON требуется следующее, т.е. тип контента
-H 'content-type: application/json'
Предположим, что данные и URL-адрес что-то вроде этого
{"электронная почта": " admin@admin.com ", "пароль": "123456"}
http://локальный:5000/апи/логин
потом в линукс
curl http://localhost:5000/api/login -H 'content-type: application/json' -d '{"email": "user@admin.com", "password": "123456"}'
в WINDOWS (параметры в одинарных кавычках не работают)
curl http://localhost:5000/api/login -H "content-type: application/json" -d "{\"email\": \"user@admin.com\", \"password\": \"123456\"}"
Ключ -X POST не требуется, если в команде присутствует -d {.....}
Для запроса на размещение
-X PUT
- -H to send something like content-type or auth token in header
- -d here put your data
- finally add site link
Note don't forget to add auth token (if you have) for authentication credentials
curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Token 2de403987713595a7955a9b4655b9e206d4294b3' -d '{"title":"Post test with curl", "body": "test body"}' http://127.0.0.1:8000/api/v1/feeds/