Solicitud Curl GET con parámetro json

124

Estoy tratando de enviar una solicitud "GET" a una API REST remota desde el símbolo del sistema a través de cURL como este:

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

Pero no devuelve ninguna salida. Traté de hacer ping a la URL directamente desde el navegador, puedo obtener una respuesta con éxito, no entiendo cuál es el problema con el comando.

Básicamente, quiero establecer una solicitud "GET" a un servicio REST remoto que me da datos json como respuesta a través de curl. ¿Alguien puede guiarme sobre qué error estoy cometiendo? Probé varias publicaciones, pero todas hablan de solicitudes POST, no de GET.

Pradeep Simha
fuente
¿Qué errores se publican en el lado del servidor?
Scary Wombat
No hay errores, el lado del servidor se está ejecutando correctamente. Pero desde el lado del rizo no muestra ningún dato. Solo hace ping después de unos segundos y se muestra en blanco sin datos.
Pradeep Simha
puedes probar con curl -i -H "Accept: application / json" " server: 5050 / a / c / getName {" param0 ":" pradeep "}" (opción -i en lugar de x).
Harshal Bulsara

Respuestas:

139

Esto debería funcionar :

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

use la opción -i en lugar de x.

Harshal Bulsara
fuente
4
tal vez una cita diferente? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB
Realmente debería ser una 'server:5050/a/c/getName{"param0":"pradeep"}'o la otra "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.
16

Si desea enviar sus datos dentro del cuerpo, debe crear un POSTo en PUTlugar de GET.

Para mí, parece que estás tratando de enviar la consulta con parámetros uri , que no está relacionado con GET, también puedes activar estos parámetros POST, PUTy así sucesivamente.

La consulta es una parte opcional, separada por un signo de interrogación ("?"), Que contiene información de identificación adicional que no es de naturaleza jerárquica. La sintaxis de la cadena de consulta no se define genéricamente, pero normalmente se organiza como una secuencia de pares =, con los pares separados por un punto y coma o un ampersand.

Por ejemplo:

curl http://server:5050/a/c/getName?param0=foo&param1=bar
Martín Seeler
fuente
7
Cualquier mensaje de solicitud HTTP puede contener un cuerpo de mensaje. Nunca es útil para GET debido a la semántica de GET: el contenido del cuerpo de la solicitud, si lo hay, no debería cambiar la respuesta.
Jarek Przygódzki
12

Si realmente desea enviar la solicitud GET con JSON en el cuerpo (por ejemplo, para una solicitud XHR y sabe que el servidor admite el procesamiento del cuerpo en solicitudes GET), puede:

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

La mayoría de los servidores web modernos aceptan este tipo de solicitud.

Steven Soroka
fuente
Esto no funciona produce el resultado deseado. Usando httpbin.org/get para depurar, esto produce: { "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" }No se recibe nada. Necesita usar una cadena de consulta comocurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques
Eso depende de si su servidor web está revisando el cuerpo en busca de solicitudes GET, lo que admito no es un comportamiento completamente estándar. Puede que sea mejor utilizar los parámetros de consulta de URL como dice. Un problema con el uso de un cuerpo en una solicitud de obtención es que el navegador no puede reproducir la solicitud navegando con el historial del navegador, aunque esto probablemente esté bien para las solicitudes XHR.
Steven Soroka
Alternativamente, lo que se puede hacer, si uno tiene suficiente control en el lado del servidor, es agregar una propiedad especial en los datos json como "método": "obtener", enviar la carga útil en una solicitud de publicación y hacer que el código en el servidor interprete esto como una solicitud de obtención.
Jacques
@Jacques seguro, pero si tiene el control del servidor, puede hacer que su servidor lea los cuerpos de las solicitudes GET con la misma facilidad. Volviendo a la pregunta original, creo que toda esta tangente está un poco fuera de tema. Releyendo la pregunta, no creo que OP tenga acceso para cambiar el servidor.
Steven Soroka
sí, eso es verdad. Si controlas el servidor. Mi comentario fue impulsado por la siguiente declaración que hizo que, como dije, no produciría el resultado esperado: "La mayoría de los servidores web modernos aceptan este tipo de solicitud". De hecho, aceptarían la solicitud que describiste, pero la solicitud no produciría el resultado esperado. O tal vez desee revisar la declaración como esta: "La mayoría de los servidores web modernos aceptan este tipo de solicitud asumiendo que tiene control directo en el lado del servidor, pero esto no es estándar"
Jacques
8

GET toma pares de nombre y valor.

Prueba algo como:

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

o

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

por cierto, un REST regular debería verse algo así como

curl http://server:5050/a/c/getName/pradeep Si toma JSON en GET URL, no es una forma estándar.

usuario2877889
fuente
4

Para servicios protegidos con nombre de usuario y contraseña, utilice lo siguiente

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'
Sandeep KV
fuente
curl -X POST -H "Tipo de contenido: aplicación / json" -d '{"cosas": "cosas"}' http: // ...
keithpjolley
Corrígeme si me equivoco, pero tener -d en una solicitud curl (y no especificar el método) hará que la solicitud sea POST.
Gokigooooks
3

Tratar

curl -G ...

en vez de

curl -X GET ...

Normalmente no necesita esta opción. Todo tipo de solicitudes GET, HEAD, POST y PUT se invocan mediante el uso de opciones de línea de comandos dedicadas.

Esta opción solo cambia la palabra real utilizada en la solicitud HTTP, no altera la forma en que se comporta curl. Entonces, por ejemplo, si desea realizar una solicitud HEAD adecuada, usar -X HEAD no será suficiente. Necesita usar la opción -I, --head.

smci
fuente
1

Ninguna de las soluciones mencionadas anteriormente funcionó para mí por alguna razón. Aquí está mi solución. Es bastante básico.

curl -X GET API_ENDPOINT -H 'Tipo de contenido: aplicación / json' -d ' JSON_DATA '

API_ENDPOINT es su punto final de API, por ejemplo: http://127.0.0.1:80/api

-H se ha utilizado para agregar contenido de encabezado.

JSON_DATA es el cuerpo de su solicitud, puede ser algo como :: {"data_key": "value"}. '' que rodean JSON_DATA son importantes.

Cualquier cosa después de -d son los datos que debe enviar en la solicitud GET

bhatman
fuente