Curl GET-запит з параметром json


124

Я намагаюся надсилати запит "GET" на віддалений API REST з командного рядка через cURL, як це:

curl -X GET -H "Content-type: application/json" -H "Accept: application/json"  "http://server:5050/a/c/getName/{"param0":"pradeep"}"

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

В основному я хочу встановити "GET" запит на віддалений сервіс REST, який дає мені дані json як відповідь через curl. Хтось може мене керувати, яку помилку я роблю? Я пробував різні пости, але всі вони говорять про POST-запити, а не про GET.


які помилки публікуються на вашому сервері?
Страшна вомба

Немає помилок, з боку сервера він виконується успішно. Але з боку завивки це не відображає ніяких даних. Це лише пінг через декілька секунд, він просто відображає порожній без даних.
Pradeep Simha

чи можете ви спробувати curl -i -H "Прийняти: application / json" " сервер: 5050 / a / c / getName {" param0 ":" pradeep "}" (опція -i замість x).
Харшал Бульсара

Відповіді:


139

Це має працювати:

  curl -i -H "Accept: application/json" 'server:5050/a/c/getName{"param0":"pradeep"}'

використовувати варіант -i замість х.


4
можливо, інша цитата? "сервер: 5050 / a / c / getName {'param0': 'pradeep'}"
AB

Це дійсно повинно бути 'server:5050/a/c/getName{"param0":"pradeep"}'або "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Бенджамін В.

16

Якщо ви хочете надіслати свої дані всередині тіла, вам потрібно зробити POSTабо PUTзамість цього GET.

Для мене, це виглядає , як ви намагаєтеся відправити запит з Урі параметрами , які не зв'язані з GET, ви також можете помістити ці параметри на POST, PUTі так далі.

Запит - це необов'язкова частина, розділена знаком питання ("?"), Що містить додаткову ідентифікаційну інформацію, яка не є ієрархічною за своєю суттю. Синтаксис рядка запиту не визначений загалом, але він зазвичай організований у вигляді послідовності = пар, причому пари розділені крапкою з комою або символом.

Наприклад:

curl http://server:5050/a/c/getName?param0=foo&param1=bar

7
Будь-яке повідомлення HTTP-запиту може містити тіло повідомлення. Він ніколи не корисний для GET через семантику GET - вміст тіла запиту, якщо такий є, не повинен змінювати відповідь.
Jarek Przygódzki

12

Якщо ви дійсно хочете подати запит GET з JSON в тілі (скажімо, на запит XHR, і ви знаєте, що сервер підтримує обробку тіла на GET-запити), ви можете:

curl -X GET \
  -H "Content-type: application/json" \
  -H "Accept: application/json" \
  -d '{"param0":"pradeep"}' \
  "http://server:5050/a/c/getName"

Більшість сучасних веб-серверів приймають такий тип запиту.


Це не дає результату, призначеного. Використовуючи httpbin.org/get для налагодження, це дає результат: { "args": {}, "headers": { "Accept": "application/json", "Content-Length": "20", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0" }, "origin": "27.94.235.50, 27.94.235.50", "url": "https://httpbin.org/get" }нічого не отримується. Вам потрібно використовувати рядок запиту типуcurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques,

Це залежить від того, перевіряє чи не ваш веб-сервер тіло на GET-запити, що, я визнаю, не зовсім стандартна поведінка. Можливо, вам буде краще використовувати параметри запиту URL, як ви говорите. Одне з питань використання тіла на запит на отримання полягає в тому, що браузер не може відтворити запит, переходячи до історії браузера, хоча це, можливо, добре для запитів XHR.
Стівен Сорока

Альтернативно, що можна зробити, якщо у вас достатньо контролю на стороні сервера, це додати спеціальне властивість у дані json, наприклад, "метод": "отримати", надіслати корисне навантаження у запиті на пошту та мати код на сервері інтерпретувати це як запит на отримання.
Жак

@Jacques впевнений, але якщо ти маєш контроль над сервером, ти можеш так само легко змусити ваш сервер читати органи GET-запитів. Повертаючись до початкового питання, я думаю, що вся ця дотична ситуація трохи поза темою. Перечитавши питання, я не думаю, що ОП має доступ до зміни сервера.
Стівен Сорока

так, це правда. Якщо ви керуєте сервером. Мій коментар був спровокований наступною заявою, яку ви зробили, яка, як я вже сказав, не призведе до наміченого результату: "Більшість сучасних веб-серверів приймають такий тип запиту". Фактично вони приймають описаний вами запит, але запит не дасть наміченого результату. Або ви можете переглянути таке твердження: "Більшість сучасних веб-серверів приймають такий тип запиту, припускаючи, що ви маєте прямий контроль на стороні сервера, але це нестандартно"
Жак

8

GET приймає пари значень імен.

Спробуйте щось на кшталт:

curl http://server:5050/a/c/getName/?param1=pradeep

або

curl http://server:5050/a/c/getName?param1=pradeep

btw звичайний REST повинен виглядати приблизно так

curl http://server:5050/a/c/getName/pradeep Якщо для отримання JSON GET URL це не стандартний спосіб.


4

Для служб, захищених іменем користувача та паролем, використовуйте наступне

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'

curl -X POST -H "Тип вмісту: application / json" -d '{"stuff": "things"}' http: // ...
keithpjolley

Виправте мене, якщо я помиляюся, але, якщо -d на запит curl (і не вказуючи метод) зробить запит POST.
Gokigooooks

3

Спробуйте

curl -G ...

замість

curl -X GET ...

Зазвичай ця опція вам не потрібна. Усі види запитів GET, HEAD, POST та PUT викликаються за допомогою спеціальних параметрів командного рядка.

Цей параметр змінює лише фактичне слово, яке використовується у запиті HTTP, воно не змінює поводження curl. Так, наприклад, якщо ви хочете зробити належний запит HEAD, використання -X HEAD буде недостатньо. Вам потрібно скористатися опцією -I, --head.


1

Жодне з вищезгаданих рішень не працювало для мене через певні причини. Ось моє рішення. Це досить базово.

curl -X GET API_ENDPOINT -H 'Тип вмісту: application / json' -d ' JSON_DATA '

API_ENDPOINT - ваша кінцева точка api, наприклад: http://127.0.0.1:80/api

-H використовується для додавання вмісту заголовка.

JSON_DATA - це ваш запит, це може бути щось на зразок :: {"data_key": "value"}. '' оточуючі JSON_DATA важливі.

Що-небудь після -d - це дані, які вам потрібно надіслати у GET-запиті

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