¿Cómo publico datos JSON con cURL?

2834

Uso Ubuntu e instalé cURL en él. Quiero probar mi aplicación Spring REST con cURL. Escribí mi código POST en el lado de Java. Sin embargo, quiero probarlo con cURL. Estoy tratando de publicar datos JSON. Los datos de ejemplo son así:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

Yo uso este comando:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

Devuelve este error:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

La descripción del error es esta:

El servidor rechazó esta solicitud porque la entidad de solicitud está en un formato no admitido por el recurso solicitado para el método solicitado ().

Registro de Tomcat: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

¿Cuál es el formato correcto del comando cURL?

Este es mi PUTcódigo lateral de Java (he probado GET y DELETE y funcionan):

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}
kamaci
fuente
66
consulte el enlace para las solicitudes de publicación de primavera 3.2.0.
AmirHd
8
Hay una buena publicación Uso de Curl para pruebas ad hoc de microservicios RESTful que cubre esto con múltiples ejemplos.
upitau

Respuestas:

4342

Debe configurar su tipo de contenido en application / json. Pero -denvía el tipo de contenido application/x-www-form-urlencoded, que no se acepta por parte de Spring.

Mirando la página del manual de curl , creo que puedes usar -H:

-H "Content-Type: application/json"

Ejemplo completo:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

( -HEs la abreviatura de --header, -dpor --data)

Tenga en cuenta que -request POST es opcional si lo usa -d, ya que el -dindicador implica una solicitud POST.


En Windows, las cosas son ligeramente diferentes. Ver el hilo de comentarios.

Sean Patrick Floyd
fuente
262
Para Windows, las comillas simples alrededor de json no funcionaron y terminé escapando de las comillas dobles. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
FELIZ
37
Para mí, en Windows, necesitaba escapar de las comillas usando comillas en este formato "{ """key1""": """value1""" }". También esta respuesta: stackoverflow.com/questions/18314796/…
chodorowicz
44
@chodorowicz eso es horrible! ¡Solo sé esa sintaxis de VB!
Sean Patrick Floyd el
3
He tenido problemas con las solicitudes POST pero las resolví con "Aplicación / json" en mayúsculas, por lo que si obtiene un error 415, verifique las mayúsculas.
WiteCastle
55
@ostrokach lo siento, ha perdido su tiempo. La sintaxis funcionó bien para mí en OSX cuando la publiqué (no he vuelto a intentarlo). Supongo que es / fue solo una diferencia de plataforma. Me imagino que los votos a favor provienen de personas a las que ayudó.
Adam Tuttle
565

Intente poner sus datos en un archivo, diga body.jsony luego use

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
Typisch
fuente
12
Probablemente deberías usar la --data-binaryopción en lugar de --data. Uno esperaría que el cliente envíe los datos tal cual, pero --dataelimina CR y LF de la entrada.
h2stein
14
Usar cUrl con cadenas json en línea parece ser una pesadilla. Existe la necesidad de escapar del carácter de comillas dobles. Ir con un archivo como este es mejor.
Xtreme Biker
46
Es importante agregar un @carácter antes del nombre del archivo, de lo contrario no funcionará. Acabo de pasar 20 minutos golpeándome la cabeza con esta basura ...
Radu Murzea
3
De esta manera, también puede ejecutar una pelusa JSON en el archivo para ver si hay un error al analizar el JSON.
datashaman
44
En Windows, necesita comillas dobles alrededor del nombre de archivo "@ body.json"
Stomf
100

Puede encontrar útil resty: https://github.com/micha/resty

Es un envoltorio redondo CURL que simplifica las solicitudes REST de la línea de comandos. Lo apuntas a tu punto final de API y te da comandos PUT y POST. (Ejemplos adaptados de la página de inicio)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

Además, a menudo todavía es necesario agregar los encabezados de Tipo de contenido. Sin embargo, puede hacer esto una vez para establecer un valor predeterminado de agregar archivos de configuración por método por sitio: Configuración de las opciones de RESTY predeterminadas

mo-seph
fuente
93

Para Windows, tener una comilla simple para el -dvalor no funcionó para mí, pero funcionó después de cambiar a comillas dobles. También necesitaba escapar de las comillas dobles entre llaves.

Es decir, lo siguiente no funcionó:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

Pero lo siguiente funcionó:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
Venkatnz
fuente
55
FYI - parece que te estás perdiendo una cita doble de cierre alrededor del cuerpo de json
acanby el
3
Para mí en Windows, el "alrededor de los datos no funciona, no funcionan las comillas en su lugar
rodedo
3
Si está utilizando PowerShell, vea esta respuesta.
rsenna
86

Funcionó para mí usando:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

Fue felizmente mapeado al controlador Spring:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnlyes un POJO simple con una propiedad de identificación.

Luis
fuente
56

Como ejemplo, cree un archivo JSON, params.json, y agregue este contenido:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

Luego ejecutas este comando:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server
Eduardo Cerqueira
fuente
42

Acabo de encontrarme con el mismo problema. Podría resolverlo especificando

-H "Content-Type: application/json; charset=UTF-8"
Rodillo Steffen
fuente
37

Esto funcionó bien para mí.

curl -X POST --data @json_out.txt http://localhost:8080/

Dónde,

-X Significa el verbo http.

--data Significa los datos que desea enviar.

felipealvesgnu
fuente
55
El -X POSTes redundante en este ejemplo
ingeniero de software el
31

Puede usar Postman con su GUI intuitiva para ensamblar su cURLcomando.

  1. Instalar e iniciar cartero
  2. Escriba su URL, cuerpo de publicación, encabezados de solicitud, etc. pp.
  3. Haga clic en Code
  4. Seleccione cURLde la lista desplegable
  5. copia y pega tu cURLcomando

Nota: Hay varias opciones para la generación automática de solicitudes en la lista desplegable, por lo que pensé que mi publicación era necesaria en primer lugar.

kiltek
fuente
66
No me di cuenta de que esa función estaba incluida en Postman. ¡Gracias por mencionarlo!
Ariestav
29

Usando CURL Windows, intente esto:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
Márcio Brener
fuente
28

Puedes usar cartero para convertir a CURLingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

byte mamba
fuente
1
Muchas gracias @ forever-LA fue un consejo para salvarme la vida
vibs2006
24

HTTPie es una alternativa recomendada curlporque puedes hacer solo

$ http POST http://example.com/some/endpoint name=value name1=value1

Habla JSON de forma predeterminada y se encargará tanto de configurar el encabezado necesario para usted como de codificar datos como JSON válido. También hay:

Some-Header:value

para encabezados y

name==value

para consultar los parámetros de la cadena. Si tiene una gran cantidad de datos, también puede leerlos desde un archivo si está codificado con JSON:

 field=@file.txt
tosh
fuente
20

Si está probando una gran cantidad de envíos / respuestas JSON en una interfaz RESTful, puede consultar el complemento Postman para Chrome (que le permite definir manualmente las pruebas de servicio web) y su comando Newman basado en Node.js. en línea (que le permite automatizar las pruebas contra "colecciones" de pruebas de Postman). ¡Gratis y abierto!

ftexperts
fuente
18

Esto funcionó bien para mí, además de usar autenticación BÁSICA:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'
        http://httpbin.org/post

Por supuesto, nunca debe usar la autenticación BASIC sin SSL y un certificado verificado.

Me encontré con esto nuevamente hoy, usando cURL 7.49.1 de Cygwin para Windows ... Y cuando usé --datao --data-binarycon un argumento JSON, cURL se confundió e interpretó {}el JSON como una plantilla de URL. Agregar un -gargumento para desactivar el pegado de cURL solucionó eso.

Consulte también Pasar una URL con corchetes para rizar .

davenpcj
fuente
17

También puede poner su contenido JSON en un archivo y pasarlo a curl usando la --file-uploadopción a través de una entrada estándar, como esta:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
niken
fuente
16

Esto funcionó para mí:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
Amit Vujic
fuente
10

Estoy usando el siguiente formato para probar con un servidor web.

use -F 'json data'

Asumamos este formato de dictado JSON:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

Ejemplo completo

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
usuario3180641
fuente
6

Use la opción -d para agregar carga útil

curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

Adicionalmente:

use -X POST para usar el método POST

use -H 'Aceptar: aplicación / json' para agregar el encabezado de tipo de aceptación

use -H 'Content-Type: application / json' para agregar encabezado de tipo de contenido

Sma Ma
fuente
Traté de usarlo pero recibí el error {"errores": ["no se proporcionaron datos"]}.
Suresh
6

Por favor revise esta herramienta . Le ayuda a crear fácilmente fragmentos de rizo.

curl -XGET -H "Accept: application/json" -d "{\"value\":\"30\",\"type\":\"Tip 3\",\"targetModule\":\"Target 3\",\"configurationGroup\":null,\"name\":\"Configuration Deneme 3\",\"description\":null,\"identity\":\"Configuration Deneme 3\",\"version\":0,\"systemId\":3,\"active\":true}" "http://localhost:8080/xx/xxx/xxxx"
Pranay Kumar
fuente
6

Esto funcionó para mí en Windows10

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4
sudhanshu srivastava
fuente
5

Aquí hay otra forma de hacerlo, si tiene que incluir datos dinámicos.

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"
Anand Rockzz
fuente
1
¡Me salvaste la vida!
Abhimanyu
4

Lo sé, se ha respondido mucho a esta pregunta, pero quería compartir dónde tuve el problema de:

curl -X POST http: // your-server-end-point -H "Content-Type: application / json" -d @ path-of-your-json-file.json

Mira, hice todo bien, solo una cosa: "@" me perdí antes de la ruta del archivo JSON.

Encontré un documento de referencia relevante en Internet: https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

Espero que pueda ayudar a unos pocos. Gracias

Usted es maravilloso
fuente
1

Si configura el SWAGGER en su aplicación de arranque de primavera e invoca cualquier API desde su aplicación allí, también puede ver esa solicitud CURL.

Creo que esta es la manera fácil de generar las solicitudes a través de CURL.

AnilkumarReddy
fuente