Richiesta GET di Curl con parametro json


124

Sto cercando di inviare una richiesta "GET" a un'API REST remota dal prompt dei comandi tramite cURL in questo modo:

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

Ma non restituisce alcun output. Ho provato a eseguire il ping dell'URL direttamente dal browser, riesco a ottenere una risposta con successo, non capisco qual è il problema con il comando.

Fondamentalmente voglio impostare una richiesta "GET" a un servizio REST remoto che mi fornisce dati json come risposta tramite curl. Qualcuno può guidarmi quale errore sto facendo? Ho provato vari post, ma tutti parlano di richieste POST non di GET.


quali errori vengono pubblicati sul tuo server?
Scary Wombat

Nessun errore, lato server viene eseguito correttamente. Ma dal lato del ricciolo non visualizza alcun dato. Esegue il ping dopo pochi secondi e viene visualizzato in bianco senza dati.
Pradeep Simha

puoi provare con curl -i -H "Accept: application / json" " server: 5050 / a / c / getName {" param0 ":" pradeep "}" (opzione -i invece di x).
Harshal Bulsara

Risposte:


139

Questo dovrebbe funzionare:

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

usa l'opzione -i invece di x.


4
forse citazione diversa? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB

Dovrebbe essere davvero o 'server:5050/a/c/getName{"param0":"pradeep"}'o "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.

16

Se vuoi inviare i tuoi dati all'interno del corpo, devi creare un POSTo PUTinvece di GET.

Per me, sembra che si sta cercando di inviare la query con parametri URI , che non è legato al GET, si può anche mettere questi parametri POST, PUTe così via.

La query è una parte facoltativa, separata da un punto interrogativo ("?"), Che contiene informazioni di identificazione aggiuntive che non sono di natura gerarchica. La sintassi della stringa di query non è definita genericamente, ma è comunemente organizzata come una sequenza di coppie =, con le coppie separate da un punto e virgola o da una e commerciale.

Per esempio:

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

7
Qualsiasi messaggio di richiesta HTTP può contenere un corpo del messaggio. Non è mai utile per GET a causa della semantica GET - il contenuto del corpo della richiesta, se presente, non dovrebbe cambiare la risposta.
Jarek Przygódzki

12

Se vuoi davvero inviare la richiesta GET con JSON nel corpo (ad esempio per una richiesta XHR e sai che il server supporta l'elaborazione del corpo su richieste GET), puoi:

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

La maggior parte dei server web moderni accetta questo tipo di richiesta.


Questo non funziona produce il risultato desiderato. Utilizzando httpbin.org/get per il debug, si ottiene: { "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" }Non si riceve nulla. È necessario utilizzare una stringa di query comecurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques

Dipende dal fatto che il tuo server web stia controllando o meno il corpo per le richieste GET, che ammetto non è un comportamento del tutto standard. Potrebbe essere meglio usare i parametri di query dell'URL come dici tu. Un problema con l'utilizzo di un corpo su una richiesta get è che il browser non può riprodurre la richiesta navigando con la cronologia del browser, anche se questo probabilmente va bene per le richieste XHR.
Steven Soroka

In alternativa quello che si può fare, se si ha abbastanza controllo sul lato server, è aggiungere una proprietà speciale nei dati json come "method": "get", inviare il payload in una richiesta post e fare in modo che il codice sul server lo interpreti come richiesta di get.
Jacques

@Jacques certo, ma se hai il controllo del server puoi altrettanto facilmente far leggere al tuo server i corpi delle richieste GET. Tornando alla domanda originale, penso che tutta questa tangente sia un po 'fuori tema. Rileggendo la domanda, non credo che OP abbia accesso per cambiare il server.
Steven Soroka

sì è vero. Se controlli il server. Il mio commento è stato stimolato dalla seguente dichiarazione che, come ho detto, non avrebbe prodotto il risultato desiderato: "La maggior parte dei server web moderni accetta questo tipo di richiesta". In realtà, accetterebbero la richiesta che hai descritto, ma la richiesta non produrrebbe il risultato desiderato. Oppure potresti voler rivedere l'affermazione in questo modo: "La maggior parte dei server web moderni accetta questo tipo di richiesta supponendo che tu abbia il controllo diretto sul lato server, ma questo non è standard"
Jacques

8

GET accetta coppie di valori nome.

Prova qualcosa come:

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

o

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

btw un normale REST dovrebbe assomigliare a qualcosa

curl http://server:5050/a/c/getName/pradeep Se richiede JSON in GET URL, non è un modo standard.


4

Per i servizi protetti da nome utente e password utilizzare quanto segue

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

Correggimi se sbaglio, ma avendo -d su una richiesta di curl (e non specificando il metodo) renderà la richiesta un POST.
Gokigooooks

3

Provare

curl -G ...

invece di

curl -X GET ...

Normalmente non hai bisogno di questa opzione. Tutti i tipi di richieste GET, HEAD, POST e PUT vengono invece richiamati utilizzando le opzioni della riga di comando dedicate.

Questa opzione cambia solo la parola effettiva utilizzata nella richiesta HTTP, non altera il modo in cui si comporta curl. Quindi, ad esempio, se vuoi fare una richiesta HEAD appropriata, usare -X HEAD non sarà sufficiente. Devi usare l'opzione -I, --head.


1

Nessuna delle soluzioni sopra menzionate ha funzionato per me per qualche motivo. Ecco la mia soluzione. È piuttosto semplice.

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

API_ENDPOINT è il tuo endpoint API, ad esempio: http://127.0.0.1:80/api

-H è stato utilizzato per aggiungere il contenuto dell'intestazione.

JSON_DATA è il corpo della tua richiesta, può essere qualcosa come :: {"data_key": "value"}. '' che circondano JSON_DATA sono importanti.

Qualunque cosa dopo -d sono i dati che devi inviare nella richiesta GET

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.