Requête Curl GET avec paramètre json

124

J'essaie d'envoyer une demande "GET" à une API REST distante à partir de l'invite de commande via cURL comme ceci:

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

Mais il ne renvoie aucune sortie. J'ai essayé de cingler l'URL directement à partir du navigateur, je suis en mesure d'obtenir une réponse avec succès, je ne comprends pas quel est le problème avec la commande.

Fondamentalement, je veux définir une requête "GET" sur un service REST distant qui me donne des données json en tant que réponse via curl. Quelqu'un peut-il me guider sur l'erreur que je fais? J'ai essayé divers articles, mais tous parlent de demandes POST et non de GET.

Pradeep Simha
la source
quelles erreurs sont affichées sur votre serveur?
Scary Wombat
Aucune erreur, côté serveur, il s'exécute avec succès. Mais du côté curl, il n'affiche aucune donnée. Il pings juste après quelques secondes, il affiche juste vide sans données.
Pradeep Simha
pouvez-vous essayer avec curl -i -H "Accept: application / json" " serveur: 5050 / a / c / getName {" param0 ":" pradeep "}" (option -i au lieu de x).
Harshal Bulsara

Réponses:

139

Cela devrait fonctionner:

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

utilisez l'option -i au lieu de x.

Harshal Bulsara
la source
4
peut-être une citation différente? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB
Cela devrait vraiment être soit 'server:5050/a/c/getName{"param0":"pradeep"}'ou "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.
16

Si vous souhaitez envoyer vos données à l'intérieur du corps, vous devez faire un POSTou PUTau lieu de GET.

Pour moi, il semble que vous essayez d'envoyer la requête avec des paramètres uri , qui ne sont pas liés à GET, vous pouvez également activer ces paramètres POST, PUTet ainsi de suite.

La requête est une partie facultative, séparée par un point d'interrogation ("?"), Qui contient des informations d'identification supplémentaires qui ne sont pas de nature hiérarchique. La syntaxe de la chaîne de requête n'est pas définie de manière générique, mais elle est généralement organisée comme une séquence de = paires, les paires étant séparées par un point-virgule ou une esperluette.

Par exemple:

curl http://server:5050/a/c/getName?param0=foo&param1=bar
Martin Seeler
la source
7
Tout message de requête HTTP est autorisé à contenir un corps de message. Cela n'est jamais utile pour GET à cause de la sémantique GET - le contenu du corps de la requête, le cas échéant, ne devrait pas changer de réponse.
Jarek Przygódzki
12

Si vous voulez vraiment soumettre la requête GET avec JSON dans le corps (par exemple, pour une requête XHR et vous savez que le serveur prend en charge le traitement du corps sur les requêtes GET), vous pouvez:

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

La plupart des serveurs Web modernes acceptent ce type de demande.

Steven Soroka
la source
Cela ne fonctionne pas pour produire le résultat escompté. En utilisant httpbin.org/get pour le débogage, cela donne: { "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" }Rien n'est reçu. Vous devez utiliser une chaîne de requête commecurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques
Cela dépend du fait que votre serveur Web vérifie ou non le corps des requêtes GET, ce qui, je l'admets, n'est pas entièrement un comportement standard. Vous feriez peut-être mieux d'utiliser les paramètres de requête d'URL comme vous le dites. Un problème avec l'utilisation d'un corps sur une demande d'obtention est que le navigateur ne peut pas rejouer la demande en naviguant avec l'historique du navigateur, bien que cela soit probablement bien pour les demandes XHR.
Steven Soroka
Alternativement, ce que l'on peut faire, si l'on a suffisamment de contrôle côté serveur, est d'ajouter une propriété spéciale dans les données json comme "method": "get", envoyer la charge utile dans une demande de publication et faire interpréter le code sur le serveur comme une demande d'obtention.
Jacques
@Jacques bien sûr, mais si vous avez le contrôle du serveur, vous pouvez tout aussi facilement faire lire à votre serveur le corps des requêtes GET. Pour en revenir à la question initiale, je pense que toute cette tangente est un peu hors sujet. En relisant la question, je ne pense pas qu'OP ait accès pour changer de serveur.
Steven Soroka
Oui c'est vrai. Si vous contrôlez le serveur. Mon commentaire a été motivé par la déclaration suivante que vous avez faite qui, comme je l'ai dit, ne produirait pas le résultat escompté: "La plupart des serveurs Web modernes acceptent ce type de demande". En fait, ils accepteraient la demande que vous avez décrite, mais la demande ne produirait pas le résultat escompté. Ou vous voudrez peut-être réviser la déclaration comme ceci: "La plupart des serveurs Web modernes acceptent ce type de demande en supposant que vous avez un contrôle direct côté serveur, mais ce n'est pas standard"
Jacques
8

GET prend des paires de valeur de nom.

Essayez quelque chose comme:

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

ou

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

btw un REST normal devrait ressembler à quelque chose comme

curl http://server:5050/a/c/getName/pradeep Si cela prend JSON dans GET URL, ce n'est pas un moyen standard.

user2877889
la source
4

Pour les services protégés par nom d'utilisateur et mot de passe, utilisez les éléments suivants

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'
Sandeep KV
la source
curl -X POST -H "Content-type: application / json" -d '{"stuff": "things"}' http: // ...
keithpjolley
Corrigez-moi si je me trompe, mais avoir -d sur une requête curl (et ne pas spécifier la méthode) fera de la requête un POST.
Gokigooooks
3

Essayer

curl -G ...

au lieu de

curl -X GET ...

Normalement, vous n'avez pas besoin de cette option. Toutes sortes de requêtes GET, HEAD, POST et PUT sont plutôt appelées en utilisant des options de ligne de commande dédiées.

Cette option ne modifie que le mot réel utilisé dans la requête HTTP, elle ne modifie pas le comportement de curl. Ainsi, par exemple, si vous voulez faire une demande HEAD correcte, utiliser -X HEAD ne suffira pas. Vous devez utiliser l'option -I, --head.

smci
la source
1

Aucune des solutions mentionnées ci-dessus n'a fonctionné pour moi pour une raison quelconque. Voici ma solution. C'est assez basique.

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

API_ENDPOINT est votre point de terminaison API, par exemple: http://127.0.0.1:80/api

-H a été utilisé pour ajouter du contenu d'en-tête.

JSON_DATA est le corps de votre requête, il peut être quelque chose comme :: {"data_key": "value"}. '' entourant JSON_DATA sont importants.

Tout ce qui suit -d correspond aux données que vous devez envoyer dans la requête GET

bhatman
la source