Как отправить данные 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

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

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

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

Другие вопросы по тегам