Curl GET-Anforderung mit json-Parameter

124

Ich versuche, eine "GET" -Anforderung von der Eingabeaufforderung über cURL wie folgt an eine Remote-REST-API zu senden:

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

Es wird jedoch keine Ausgabe zurückgegeben. Ich habe versucht, die URL direkt über den Browser zu pingen. Ich kann erfolgreich eine Antwort erhalten. Ich verstehe nicht, was mit dem Befehl falsch ist.

Grundsätzlich möchte ich eine "GET" -Anforderung an einen Remote-REST-Dienst richten, der mir JSON-Daten als Antwort über Curl gibt. Kann mir jemand sagen, welchen Fehler ich mache? Ich habe verschiedene Beiträge ausprobiert, aber alle sprechen von POST-Anfragen, nicht von GET.

Pradeep Simha
quelle
Welche Fehler werden auf Ihrer Serverseite veröffentlicht?
Scary Wombat
Keine Fehler, serverseitig wird es erfolgreich ausgeführt. Von der Lockenseite werden jedoch keine Daten angezeigt. Es pingt nur nach wenigen Sekunden, es wird nur leer ohne Daten angezeigt.
Pradeep Simha
können Sie versuchen, mit curl -i -H "Accept: application / json" " Server: 5050 / a / c / getName {" param0 ":" pradeep "}" (Option -i anstelle von x).
Harshal Bulsara

Antworten:

139

Das sollte funktionieren :

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

Verwenden Sie die Option -i anstelle von x.

Harshal Bulsara
quelle
4
vielleicht anderes Zitat? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB
Es sollte wirklich entweder 'server:5050/a/c/getName{"param0":"pradeep"}'oder sein "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.
16

Wenn Sie Ihre Daten innerhalb des Körpers senden möchten, müssen Sie ein POSToder PUTanstelle von erstellen GET.

Für mich sieht es aus wie Sie versuchen , die senden Abfrage mit uri Parameter , die nicht verwandt ist GET, können Sie diese Parameter auch setzen auf POST, PUTund so weiter.

Die Abfrage ist ein optionaler Teil, der durch ein Fragezeichen ("?") Getrennt ist und zusätzliche Identifikationsinformationen enthält, die nicht hierarchischer Natur sind. Die Syntax der Abfragezeichenfolge ist nicht generisch definiert, sondern wird üblicherweise als Folge von = Paaren organisiert, wobei die Paare durch ein Semikolon oder ein kaufmännisches Und getrennt sind.

Beispielsweise:

curl http://server:5050/a/c/getName?param0=foo&param1=bar
Martin Seeler
quelle
7
Jede HTTP-Anforderungsnachricht darf einen Nachrichtentext enthalten. Aufgrund der GET-Semantik ist es für GET niemals nützlich. Der Inhalt des Anforderungshauptteils sollte, falls vorhanden, die Antwort nicht ändern.
Jarek Przygódzki
12

Wenn Sie die GET-Anforderung wirklich mit JSON im Hauptteil senden möchten (z. B. für eine XHR-Anforderung und Sie wissen, dass der Server die Verarbeitung des Hauptteils bei GET-Anforderungen unterstützt), können Sie:

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

Die meisten modernen Webserver akzeptieren diese Art von Anfragen.

Steven Soroka
quelle
Dies funktioniert nicht und führt zu dem beabsichtigten Ergebnis. Wenn Sie httpbin.org/get zum Debuggen verwenden, ergibt dies: { "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" }Es wird nichts empfangen. Sie müssen eine Abfragezeichenfolge wiecurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques
Das hängt davon ab, ob Ihr Webserver den Body auf GET-Anforderungen überprüft oder nicht. Ich gebe zu, dass dies kein Standardverhalten ist. Möglicherweise sind Sie besser dran, wenn Sie die URL-Abfrageparameter verwenden, wie Sie sagen. Ein Problem bei der Verwendung eines Hauptteils für eine Abrufanforderung besteht darin, dass der Browser die Anforderung nicht durch Navigieren mit dem Browserverlauf wiedergeben kann, obwohl dies wahrscheinlich für XHR-Anforderungen in Ordnung ist.
Steven Soroka
Alternativ kann man, wenn man auf der Serverseite genügend Kontrolle hat, den json-Daten eine spezielle Eigenschaft wie "method" hinzufügen: "get", die Nutzdaten in einer Post-Anfrage senden und den Code auf dem Server dies interpretieren lassen als get Anfrage.
Jacques
@Jacques sicher, aber wenn Sie die Kontrolle über den Server haben, können Sie Ihren Server genauso einfach Körper von GET-Anfragen lesen lassen. Um auf die ursprüngliche Frage zurückzukommen: Ich denke, diese ganze Tangente ist ein bisschen unangebracht. Beim erneuten Lesen der Frage glaube ich nicht, dass OP Zugriff hat, um den Server zu ändern.
Steven Soroka
ja das stimmt. Wenn Sie den Server steuern. Mein Kommentar wurde durch die folgende Aussage beflügelt, die, wie gesagt, nicht zum beabsichtigten Ergebnis führen würde: "Die meisten modernen Webserver akzeptieren diese Art von Anfrage". Tatsächlich würden sie die von Ihnen beschriebene Anfrage akzeptieren, aber die Anfrage würde nicht das beabsichtigte Ergebnis liefern. Oder Sie möchten die Aussage wie folgt überarbeiten: "Die meisten modernen Webserver akzeptieren diese Art von Anforderung, vorausgesetzt, Sie haben die direkte Kontrolle auf der Serverseite, aber dies ist nicht Standard"
Jacques
8

GET nimmt Name-Wert-Paare an.

Versuchen Sie etwas wie:

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

oder

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

Übrigens sollte ein normaler REST ungefähr so ​​aussehen

curl http://server:5050/a/c/getName/pradeep Wenn JSON in der GET-URL verwendet wird, ist dies kein Standard.

user2877889
quelle
4

Verwenden Sie für durch Benutzernamen und Kennwort geschützte Dienste Folgendes

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'
Sandeep KV
quelle
curl -X POST -H "Inhaltstyp: application / json" -d '{"stuff": "things"}' http: // ...
keithpjolley
Korrigieren Sie mich, wenn ich falsch liege. Wenn Sie jedoch -d für eine Curl-Anforderung haben (und die Methode nicht angeben), wird die Anforderung zu einem POST.
Gokigooooks
3

Versuchen

curl -G ...

anstatt

curl -X GET ...

Normalerweise benötigen Sie diese Option nicht. Alle Arten von GET-, HEAD-, POST- und PUT-Anforderungen werden eher mithilfe dedizierter Befehlszeilenoptionen aufgerufen.

Diese Option ändert nur das tatsächliche Wort, das in der HTTP-Anforderung verwendet wird. Sie ändert nicht das Verhalten von Curl. Wenn Sie beispielsweise eine ordnungsgemäße HEAD-Anforderung stellen möchten, reicht die Verwendung von -X HEAD nicht aus. Sie müssen die Option -I, --head verwenden.

smci
quelle
1

Keine der oben genannten Lösungen hat aus irgendeinem Grund für mich funktioniert. Hier ist meine Lösung. Es ist ziemlich einfach.

curl -X GET API_ENDPOINT -H 'Inhaltstyp: application / json' -d ' JSON_DATA '

API_ENDPOINT ist Ihr API-Endpunkt, z. B.: Http://127.0.0.1:80/api

-H wurde verwendet, um Header-Inhalte hinzuzufügen.

JSON_DATA ist Ihr Anforderungshauptteil. Es kann so etwas wie :: {"data_key": "value"} sein. '' um JSON_DATA sind wichtig.

Alles nach -d sind die Daten, die Sie in der GET-Anfrage senden müssen

Bhatman
quelle