¿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;
}

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.


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

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


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

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.


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

42

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

-H "Content-Type: application/json; charset=UTF-8"

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.


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.


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

28

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

ingrese la descripción de la imagen aquí


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

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!


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 .


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 -

16

Esto funcionó para mí:

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

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"}'

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


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"

6

Esto funcionó para mí en Windows10

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

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"

1
¡Me salvaste la vida!
Abhimanyu


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.