Я использую 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;
}
28 ответов
Вам необходимо установить тип содержимого application / json. Но -d
(или --data
) отправляет Content-Type application/x-www-form-urlencoded
, который не поддерживается Spring.
Глядя на страницу руководства по curl, я думаю, вы можете использовать -H
(или --header
):
-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 дела обстоят немного иначе. См. Ветку комментариев.
curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
"{ """key1""": """value1""" }"
. Также этот ответ: stackoverflow.com / questions / 18314796 /…
"Content-Type: application/json"
, а не только "application/json"
. Это отняло у меня много времени ...
Для 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
Кроме того, часто по-прежнему необходимо добавлять заголовки Content Type. Однако вы можете сделать это один раз, чтобы установить значение по умолчанию для добавления файлов конфигурации для каждого метода для каждого сайта: Установка параметров 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.
Я просто сталкиваюсь с той же проблемой. Я мог бы решить эту проблему, указав
-H "Content-Type: application/json; charset=UTF-8"
У меня это сработало.
curl -X POST --data @json_out.txt http://localhost:8080/
Где,
-X
Означает http-глагол.
--data
Означает данные, которые вы хотите отправить.
-X POST
в этом примере является избыточным.
--data
вместо -d
. Это зависит от того, насколько хороша команда с Bash в целом, но определенно проще для новичков в Bash и людей, которые не используют его ежедневно.
Вы можете использовать почтальон для преобразования в CURL
Заметка:
В последней версии Postman есть несколько обновлений пользовательского интерфейса, и теперь ссылка на код доступна на боковой панели.
Вы можете использовать Postman с его интуитивно понятным графическим интерфейсом для сборки своей команды cURL
. .
- Установите и запустите Postman
- Введите свой URL, текст сообщения, заголовки запроса и т. Д. Стр.
- Нажмите
Code
- В раскрывающемся списке выберите
cURL
. - скопируйте и вставьте команду
cURL
Примечание. В раскрывающемся списке есть несколько вариантов автоматической генерации запросов, поэтому я подумал, что моя публикация вообще необходима.
Используя CURL Windows, попробуйте следующее:
curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
HTTPie - это рекомендуемая альтернатива curl
, потому что вы можете просто
$ http POST http://example.com/some/endpoint name=value name1=value1
По умолчанию он говорит в формате JSON и будет обрабатывать как установку необходимого заголовка, так и кодирование данных как действительного JSON. Есть также:
Some-Header:value
Для заголовков, а также
name==value
Для параметров строки запроса. Если у вас большой кусок данных, вы также можете прочитать его из файла, если он будет закодирован в JSON:
field=@file.txt
Если вы тестируете множество отправок / ответов JSON в интерфейсе RESTful, вы можете проверить Postman для Chrome (который позволяет вручную определять тесты веб-служб) и его Newman, сопутствующий командной строке (который позволяет автоматизировать тесты по" коллекциям "тестов Postman). И бесплатно, и открыто!
Это сработало для меня, дополнительно используя аутентификацию 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 и проверенного сертификата.
Сегодня я снова столкнулся с этим, используя Cygwin cURL 7.49.1 для Windows ... И при использовании --data
или --data-binary
с аргументом JSON cURL запутался и интерпретировал {}
в JSON в качестве шаблона URL. Это исправлено добавлением аргумента -g
для отключения подстановки cURL.
См. Также Передача URL-адреса со скобками для скручивания em>.
Вы также можете поместить содержимое JSON в файл и передать его в curl с помощью параметра --upload-file
через стандартный ввод, например:
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 @ путь-из-вашего-json-файла.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"}'
Используйте параметр -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', чтобы добавить заголовок типа содержимого
curl
-v
, чтобы получить более подробную информацию. Служба, к которой вы обращаетесь, может обрабатывать только определенные значения типа содержимого.
Это сработало для меня в Windows10
curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X PUT http://localhost:8080/api/changeowner/CAR4
Я сделал для этого инструмент под названием сборщик. Он может отправлять запросы и форматировать фрагменты curl:
Вот пример:
Пример вывода:
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"
Если вы настроите SWAGGER для приложения весенней загрузки и вызовете любой API из своего приложения, вы также увидите этот запрос CURL.
Я думаю, что это простой способ генерации запросов через CURL.
На основании ответа https://stackoverflow.com/a/57369772/2391795, вот что я сделал с этим на GitHub Действия. Это было немного сложно из-за тега EOF
.
Моей целью было отправить HTTP-вызов после завершения развертывания Vercel (аналогично веб-перехватчику).
Надеясь на это реальный пример может помочь другим людям.
send-webhook-callback-once-deployment-ready:
name: Invoke webhook callback url defined by the customer (Ubuntu 18.04)
runs-on: ubuntu-18.04
needs: await-for-vercel-deployment
steps:
- uses: actions/checkout@v1 # Get last commit pushed - See https://github.com/actions/checkout
- name: Expose GitHub slug/short variables # See https://github.com/rlespinasse/github-slug-action#exposed-github-environment-variables
uses: rlespinasse/github-slug-action@v3.x # See https://github.com/rlespinasse/github-slug-action
- name: Expose git environment variables and call webhook (if provided)
# Workflow overview:
# - Resolves webhook url from customer config file
# - If a webhook url was defined, send a
run: |
MANUAL_TRIGGER_CUSTOMER="${{ github.event.inputs.customer}}"
CUSTOMER_REF_TO_DEPLOY="${MANUAL_TRIGGER_CUSTOMER:-$(cat vercel.json | jq --raw-output '.build.env.NEXT_PUBLIC_CUSTOMER_REF')}"
VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK=$(cat vercel.$CUSTOMER_REF_TO_DEPLOY.staging.json | jq --raw-output '.build.env.VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK')
# Checking if a webhook url is defined
if [ -n "$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK" ]; then
# Run script that populates git-related variables as ENV variables
echo "Running script populate-git-env.sh"
. ./scripts/populate-git-env.sh
echo "Resolved git variables:"
echo "'GIT_COMMIT_SHA': $GIT_COMMIT_SHA"
echo "'GIT_COMMIT_REF': $GIT_COMMIT_REF"
echo "'GIT_COMMIT_TAGS': $GIT_COMMIT_TAGS"
# Generates JSON using a bash function - See https://stackoverflow.com/a/57369772/2391795
# "End Of File" must be at the beginning of the line with no space/tab before or after - See https://stackoverflow.com/a/12909284/2391795
# But, when executed by GitHub Action, it must be inside the "run" section instead
generate_post_data() {
cat <<EOF
{
"MANUAL_TRIGGER_CUSTOMER": "${MANUAL_TRIGGER_CUSTOMER}",
"CUSTOMER_REF": "${CUSTOMER_REF_TO_DEPLOY}",
"STAGE": "staging",
"GIT_COMMIT_SHA": "${GIT_COMMIT_SHA}",
"GIT_COMMIT_REF": "${GIT_COMMIT_REF}",
"GIT_COMMIT_TAGS": "${GIT_COMMIT_TAGS}",
"GITHUB_REF_SLUG": "${GITHUB_REF_SLUG}",
"GITHUB_HEAD_REF_SLUG": "${GITHUB_HEAD_REF_SLUG}",
"GITHUB_BASE_REF_SLUG": "${GITHUB_BASE_REF_SLUG}",
"GITHUB_EVENT_REF_SLUG": "${GITHUB_EVENT_REF_SLUG}",
"GITHUB_REPOSITORY_SLUG": "${GITHUB_REPOSITORY_SLUG}",
"GITHUB_REF_SLUG_URL": "${GITHUB_REF_SLUG_URL}",
"GITHUB_HEAD_REF_SLUG_URL": "${GITHUB_HEAD_REF_SLUG_URL}",
"GITHUB_BASE_REF_SLUG_URL": "${GITHUB_BASE_REF_SLUG_URL}",
"GITHUB_EVENT_REF_SLUG_URL": "${GITHUB_EVENT_REF_SLUG_URL}",
"GITHUB_REPOSITORY_SLUG_URL": "${GITHUB_REPOSITORY_SLUG_URL}",
"GITHUB_SHA_SHORT": "${GITHUB_SHA_SHORT}"
}
EOF
}
echo "Print generate_post_data():"
echo "$(generate_post_data)"
echo "Calling webhook at '$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK'"
echo "Sending HTTP request (curl):"
curl POST \
"$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK" \
-vs \
--header "Accept: application/json" \
--header "Content-type: application/json" \
--data "$(generate_post_data)" \
2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
# XXX See https://stackoverflow.com/a/54225157/2391795
# -vs - add headers (-v) but remove progress bar (-s)
# 2>&1 - combine stdout and stderr into single stdout
# sed - edit response produced by curl using the commands below
# /^* /d - remove lines starting with '* ' (technical info)
# /bytes data]$/d - remove lines ending with 'bytes data]' (technical info)
# s/> // - remove '> ' prefix
# s/< // - remove '< ' prefix
else
echo "No webhook url defined in 'vercel.$CUSTOMER_REF_TO_DEPLOY.staging.json:.build.env.VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK' (found '$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK')"
fi
Вы можете передать расширение нужного формата в конце URL-адреса. например http: // localhost: 8080 / xx / xxx / xxxx .json < / сильный>
Или
http: // localhost: 8080 / xx / xxx / xxxx .xml сильный>
Примечание: вам нужно добавить зависимости jackson и jaxb maven в ваш pom.
Попробуйте поместить свои данные в файл, скажем body.json
, а затем используйте
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
--data-binary
вместо --data
. Можно было бы ожидать, что клиент отправляет данные как есть, но --data
удаляет CR и LF из ввода.
@
перед именем файла, иначе это не сработает. Я всего 20 минут бился головой об этом дерьме ...
- -H, чтобы отправить что-то вроде типа содержимого или токена аутентификации в заголовке
- -d поместите сюда свои данные
- наконец добавить ссылку на сайт
Примечание: не забудьте добавить токен аутентификации (если он есть) для учетных данных аутентификации
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/
Для 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 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
~/.curlrc
файл: --header Content-Type:Application/JSON
ВЫПУСК ЗДЕСЬ
HTTP/1.1 415 Unsupported Media Type
Вход на сервер не может интерпретировать тип носителя этого запроса, поэтому он анализирует его как text / html
Тип мультимедиа любого ресурса объявлен в свойстве Content-Type заголовка запроса.
Заголовок "accept" ... приведет к ошибке этого запроса, поэтому для отправки любого запроса JSON требуется следующее, то есть тип содержимого
-H 'content-type: application/json'
Предположим, что данные и URL-адрес выглядят примерно так
{"email": "admin@admin.com", "password": "123456"}
http: // локальный: 5000 / api / логин
Затем в LINUX
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 {.....}
Для запроса Put
-X PUT
Похожие вопросы
Связанные вопросы
Новые вопросы
json
JSON (нотация объектов JavaScript) — это сериализуемый формат обмена данными, который может быть прочитан машиной и человеком. Не используйте этот тег для собственных объектов JavaScript или литералов объектов JavaScript. Прежде чем задать вопрос, подтвердите свой JSON с помощью валидатора JSON, такого как JSONLint (https://jsonlint.com).