Питання Як задати дані JSON з Curl з терміналу / командного рядка для перевірки Spring RESET?


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

EDIT:

Це мій код 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;
} 

2049
2017-08-24 08:51


походження


перевірити посилання для весни 3.2.0 поштових запитів. - AmirHd
Є хороший пост Використання Curl для спеціального тестування RESTful мікросервісів який охоплює це з декількома прикладами. - upitau


Відповіді:


Вам потрібно вказати тип контенту для програми / json. Але -d надсилає Content-Type application/x-www-form-urlencoded, який не приймається на весняній стороні.

Дивлячись на скрутити сторінку людини, Я думаю, що ви можете використовувати -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 все дещо інше. Дивіться тег коментарів.


3234
2017-08-24 09:12



Я вилучив параметр -d з команди, але все одно той же. - kamaci
повний синтаксис, для тих, хто все ще може бути заплутаним, це: curl -X POST -H "Content-Type: application/json" -d '{"key":"val"}' URL - Adam Tuttle
curl -X POST -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:3000/api/login  працював для мене. - shweta
Для вікон, одиночні цитати навколо json не працювали, і я в кінцевому підсумку врятував подвійні лапки. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method - hIpPy
Для мене під Windows я мав уникати котирувань, використовуючи цитати в цьому форматі "{ """key1""": """value1""" }". Також ця відповідь: stackoverflow.com/questions/18314796/... - chodorowicz


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

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

426
2017-08-24 10:04



Він повертає помилку 404 - kamaci
Ви, напевно, повинні використовувати --data-binary варіант замість --data. Можна було б очікувати, що клієнт надсилає дані як є, але --data смужки CR und LF з входу. - h2stein
Використання cUrl з inline json Strings, здається, кошмар. Існує потреба висміювати символ подвійної цитати. Подібний файл виглядає краще. - Xtreme Biker
Важливо додати @ символ перед назвою файлу, інакше він не буде працювати. Я просто витратив 20 хвилин на голову на цю лайку ... - Radu Murzea
Таким чином, ви можете запустити файл JSON у файлі, щоб перевірити, чи є помилка при аналізі JSON. - datashaman


Ви можете знайти корисне: 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


86
2018-01-12 19:10





Він працював для мене за допомогою:

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 властивістю.


69
2018-04-19 16:00





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

58
2018-06-30 22:12



FYI - схоже, що у вас відсутня остаточна подвійна цитата навколо тіла Джона - acanby
Для мене в операційній системі Windows "навколо даних не працює, замість копій працює - rodedo
Якщо ви користуєтеся PowerShell, перегляньте це відповісти - rsenna


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

37
2018-01-05 23:10





Це добре для мене.

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

Де

-X Значить дієслово http.

--data Це дані, які ви хочете надіслати.


32
2017-07-01 14:31



The -X POST є зайвим у цьому прикладі - Engineer Dollery


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

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

26
2017-11-15 15:45





Використовуючи CURL Windows, спробуйте це:

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

23
2017-12-20 23:45





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


15
2018-05-23 13:34