Запрос Curl GET с параметром json

124

Я пытаюсь отправить запрос «GET» на удаленный REST API из командной строки через cURL следующим образом:

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

Но он не возвращает никаких результатов. Я попытался пропинговать URL-адрес прямо из браузера, я могу успешно получить ответ, я не понимаю, что не так с командой.

В основном я хочу установить запрос «GET» для удаленной службы REST, которая дает мне данные json в качестве ответа через curl. Может ли кто-нибудь указать мне, какую ошибку я делаю? Я пробовал разные сообщения, но все они говорят о запросах POST, а не о GET.

Прадип Симха
источник
какие ошибки публикуются на стороне вашего сервера?
Scary Wombat
Ошибок нет, на стороне сервера он выполняется успешно. Но со стороны завитка он не отображает никаких данных. Он просто пингует через несколько секунд, он просто отображается пустым без данных.
Pradeep Simha
Можете ли вы попробовать с помощью curl -i -H "Accept: application / json" " server: 5050 / a / c / getName {" param0 ":" pradeep "}" (опция -i вместо x).
Harshal Bulsara

Ответы:

139

Это должно работать:

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

используйте параметр -i вместо x.

Харшал Булсара
источник
4
возможно другая цитата? "server: 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, например "method": "get", отправить полезную нагрузку в почтовом запросе и заставить код на сервере интерпретировать это как запрос на получение.
Жак
@Jacques, конечно, но если у вас есть контроль над сервером, вы можете так же легко заставить свой сервер читать тела запросов GET. Возвращаясь к исходному вопросу, я думаю, что вся эта касательная немного не по теме. Перечитывая вопрос, я не думаю, что OP имеет доступ к смене сервера.
Стивен Сорока
Да, это правда. Если вы контролируете сервер. Мой комментарий был вызван следующим заявлением, которое вы сделали, которое, как я уже сказал, не дало бы желаемого результата: «Большинство современных веб-серверов принимают этот тип запросов». Фактически, они примут описанный вами запрос, но запрос не принесет желаемого результата. Или вы можете изменить утверждение следующим образом: «Большинство современных веб-серверов принимают этот тип запроса, если у вас есть прямой контроль на стороне сервера, но это нестандартно»
Жак
8

GET принимает пары имя-значение.

Попробуйте что-нибудь вроде:

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

или

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

кстати, обычный REST должен выглядеть примерно так

curl http://server:5050/a/c/getName/pradeep Если в URL-адресе GET используется JSON, это не стандартный способ.

user2877889
источник
4

Для служб, защищенных именем пользователя и паролем, используйте следующие

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'
Сандип К.В.
источник
curl -X POST -H "Content-type: 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.

SMCI
источник
1

Ни одно из вышеупомянутых решений не помогло мне по какой-то причине. Вот мое решение. Это довольно просто.

curl -X GET API_ENDPOINT -H 'Content-Type: 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.

bhatman
источник