¿Cómo publico datos JSON con cURL?

Yo uso Ubuntu e instalé cURL en eso. 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 intentando 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 la siguiente:

El servidor rechazó esta solicitud porque la entidad de solicitud está en un formato no compatible con 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 lado de Java PUT código (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;
}

preguntado el 24 de agosto de 11 a las 05:08

revisar la aquí para solicitudes de publicación de primavera 3.2.0. -

Hay una buena publicación Uso de Curl para pruebas ad hoc de microservicios RESTful que cubre esto con múltiples ejemplos. -

26 Respuestas

Debe establecer su tipo de contenido en application / json. Pero -d (o --data) envía el tipo de contenido application/x-www-form-urlencoded, que no se acepta por parte de Spring.

En cuanto al página de manual de curl, Creo que puedes usar -H (o --header):

-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

(-H es la abreviatura de --header, -d para --data)

Tenga en cuenta que -request POST is opcional si usas -d, Como el -d bandera implica una solicitud POST.


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

Respondido el 17 de enero de 21 a las 02:01

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 - ayuda

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

Tuve problemas con las solicitudes POST, pero lo resolví con "Application / json" en mayúsculas, por lo que si obtiene un error 415, verifique las mayúsculas. - WiteCastillo

@Adam Tuttle ¿Por qué tu comentario tiene tantos votos a favor? Con curl en ubuntu 14.04, necesitas "Content-Type: application/json", No sólo "application/json". Esto me hizo perder mucho tiempo ... - ostrokach

@ostrokach lo siento, ha hecho perder su tiempo. la sintaxis funcionó bien para mí en OSX cuando la publiqué (no lo he vuelto a intentar). Supongo que es / fue solo una diferencia de plataforma. Me imagino que los votos a favor son de personas a las que ayudó. - adam tuttle

Intente poner sus datos en un archivo, digamos body.json Y luego usar

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

Respondido 24 ago 11, 11:08

Probablemente deberías usar el --data-binary opción en lugar de --data. Uno esperaría que el cliente envíe los datos tal cual, pero --data quita CR y LF de la entrada. - h2stein

Usar cUrl con json Strings 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. - Motociclista xtreme

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 mierda ... - Radu Murzea

De esta manera, también puede ejecutar un lint JSON en el archivo para ver si hay un error al analizar el JSON. - chamán de datos

En Windows, necesita comillas dobles alrededor del nombre de archivo "@ body.json" - Stomf

Para Windows, tener una cotización única para -d value no funcionó para mí, pero funcionó después de cambiar a comillas dobles. También necesitaba escapar de las comillas dobles dentro de los corchetes.

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

contestado el 27 de mayo de 17 a las 22:05

Para su información, parece que le falta una comilla doble de cierre alrededor del cuerpo de json. acanby

Para mí, en Windows, el "alrededor de los datos no funciona, no funcionan las comillas - rodeo

Si usa PowerShell, consulte así respuesta. - rsanna

Para mejorar el manejo de cotizaciones y muchas otras razones, deje de usar el cmd.exe antiguo / débil y pruebe uno de los shells mejorados como Git-Bash de gitforwindows.org sitio. (Muy recomendable, incluso si no usa Git). MarkHu

Puede que el resty le resulte útil: https://github.com/micha/resty

Es un CURL redondo envolvente que simplifica las solicitudes REST de la línea de comandos. Lo apuntas a tu punto final de API y te da los 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 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

Respondido 08 Feb 13, 14:02

Me funcionó usando:

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

Felizmente se asignó 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";
}

IdOnly es un simple POJO con una propiedad id.

contestado el 27 de mayo de 17 a las 22:05

Como ejemplo, cree un archivo JSON, params.json, y agréguele este contenido:

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

Luego ejecuta 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

Respondido el 22 de enero de 18 a las 16:01

Consejo profesional: agregue esta línea a su ~/.curlrc archivo: --header Content-Type:Application/JSON - MarkHu

Puedes usar cartero para convertir a CURLenter image description here

enter image description here

contestado el 30 de mayo de 19 a las 07:05

Simplemente me encuentro con el mismo problema. Podría resolverlo especificando

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

respondido 15 nov., 11:15

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.

Respondido 01 Jul 15, 15:07

LA -X POST es redundante en este ejemplo - Ingeniero de software

@SoftwareEngineer, pero al menos es instructivo para principiantes. - Felipe Pereira

Es mejor tener un código transparente pero redundante, en lugar de un código no transparente. Yo tambien prefiero --data en lugar de -d. Depende de lo bueno que sea el equipo con Bash en general, pero definitivamente es más fácil para los principiantes de Bash y las personas que no lo usan a diario. - Solicitud de vado

Puedes usar Cartero con su GUI intuitiva para ensamblar su cURL mando.

  1. Instalar y comenzar Cartero
  2. Escriba su URL, cuerpo de la publicación, encabezados de solicitud, etc. págs.
  3. Haga clic en Code
  4. Seleccione cURL de la lista desplegable
  5. copia y pega tu cURL comando

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.

Respondido el 25 de Septiembre de 17 a las 13:09

No me di cuenta de que esa función estaba incluida en Postman. ¡Gracias por mencionarlo! - ariestav

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

respondido 12 mar '15, 11:03

HTTPie es una alternativa recomendada a curl porque puedes hacer solo

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

Habla JSON de forma predeterminada y manejará tanto la configuración del encabezado necesario como la codificación de datos como JSON válido. También hay:

Some-Header:value

para encabezados, y

name==value

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

 field=@file.txt

Respondido 23 ago 18, 15:08

Si está probando muchos envíos / respuestas JSON en una interfaz RESTful, es posible que desee consultar el Cartero complemento para Chrome (que le permite definir manualmente las pruebas de servicios web) y su basado en Node.js Newman compañero de línea de comandos (que le permite automatizar pruebas contra "colecciones" de pruebas de Postman). ¡Tanto gratis como abierto!

Respondido 14 Feb 17, 21:02

Esto funcionó bien para mí, además de usar la 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 BÁSICA sin SSL y un certificado verificado.

Me encontré con esto nuevamente hoy, usando Cygwin's cURL 7.49.1 para Windows ... Y al usar --data or --data-binary con un argumento JSON, cURL se confundió e interpretaría el {} en JSON como plantilla de URL. Añadiendo un -g El argumento para desactivar el globbing cURL solucionó eso.

Vea también Pasando una URL con corchetes para curl.

contestado el 27 de mayo de 17 a las 22:05

También puede poner su contenido JSON en un archivo y pasarlo a curl usando el --upload-file opción a través de entrada estándar, así:

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

Respondido 29 Oct 20, 13:10

Esto funcionó para mí:

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

Respondido 16 Oct 16, 17:10

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

enrollamiento -X POST http://your-server-end-point -H "Tipo de contenido: aplicación / json" -d @ ruta-de-su-archivo-json.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

Respondido 28 Abr '20, 15:04

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

#!/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"

Respondido 06 ago 19, 07:08

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

contestado el 27 de mayo de 17 a las 22:05

No veo cómo esto podría ser una respuesta de propósito general. Su servidor puede estar configurado para manejar este formato extraño, pero YMMV. - MarkHu

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

En adición:

use -X POST para usar el método POST

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

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

Respondido 13 Abr '19, 21:04

Traté de usarlo pero obtengo {"errors": ["no se proporcionaron datos"]} error. - Suresh

@Suresh intento curl's -v cambie para obtener más detalles. Es posible que el servicio al que acceda solo esté manejando ciertos valores de tipo de contenido. - MarkHu

Esto funcionó para mí en Windows10

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

Respondido el 23 de Septiembre de 19 a las 15:09

Hice una herramienta llamada captador para esto. Puede enviar solicitudes y formatear fragmentos de curl:

He aquí un ejemplo:

enter image description here

Ejemplo de salida:

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"

contestado el 14 de mayo de 21 a las 15:05

Solicitud / sugerencia: los enlaces URL deben estar claramente detallados. (No solo un misterioso "haga clic aquí"). Especialmente para la autopromoción de su herramienta casera. - MarkHu

Si configura el SWAGGER para 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 forma fácil de generar solicitudes a través de CURL.

respondido 28 nov., 19:12

Para powershell he usado:

curl.exe -H "Content-Type: application/json" --data "@content.json" http://localhost:8080/appname/path

Donde content.json era el nombre del archivo json en mi local que contiene la solicitud, y curl.exe en lugar de solo curl no utilizar el alias para Invoke-WebRequest.

Respondido 06 ago 21, 10:08

Basado en https://stackoverflow.com/a/57369772/2391795 respuesta, esto es lo que hice en GitHub Actions. Fue un poco complicado debido a la EOF etiqueta.

Mi objetivo era enviar una llamada HTTP una vez finalizada la implementación de Vercel (similar a un webhook).

Esperando esto ejemplo del mundo real podría ayudar a otras personas.

  send-webhook-callback-once-deployment-ready:
    name: Invoke webhook callback url defined by the customer (Ubuntu 18.04)
    runs-on: ubuntu-18.04
    needs: await-for-vercel-deployment
    steps:
      - uses: actions/checkout@v1 # Get last commit pushed - See https://github.com/actions/checkout
      - name: Expose GitHub slug/short variables # See https://github.com/rlespinasse/github-slug-action#exposed-github-environment-variables
        uses: rlespinasse/github-slug-action@v3.x # See https://github.com/rlespinasse/github-slug-action
      - name: Expose git environment variables and call webhook (if provided)
        # Workflow overview:
        #  - Resolves webhook url from customer config file
        #  - If a webhook url was defined, send a
        run: |
          MANUAL_TRIGGER_CUSTOMER="${{ github.event.inputs.customer}}"
          CUSTOMER_REF_TO_DEPLOY="${MANUAL_TRIGGER_CUSTOMER:-$(cat vercel.json | jq --raw-output '.build.env.NEXT_PUBLIC_CUSTOMER_REF')}"

          VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK=$(cat vercel.$CUSTOMER_REF_TO_DEPLOY.staging.json | jq --raw-output '.build.env.VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK')

          # Checking if a webhook url is defined
          if [ -n "$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK" ]; then
            # Run script that populates git-related variables as ENV variables
            echo "Running script populate-git-env.sh"
            . ./scripts/populate-git-env.sh

            echo "Resolved git variables:"
            echo "'GIT_COMMIT_SHA': $GIT_COMMIT_SHA"
            echo "'GIT_COMMIT_REF': $GIT_COMMIT_REF"
            echo "'GIT_COMMIT_TAGS': $GIT_COMMIT_TAGS"

            # Generates JSON using a bash function - See https://stackoverflow.com/a/57369772/2391795
            # "End Of File" must be at the beginning of the line with no space/tab before or after - See https://stackoverflow.com/a/12909284/2391795
            # But, when executed by GitHub Action, it must be inside the "run" section instead
            generate_post_data() {
              cat <<EOF
            {
              "MANUAL_TRIGGER_CUSTOMER": "${MANUAL_TRIGGER_CUSTOMER}",
              "CUSTOMER_REF": "${CUSTOMER_REF_TO_DEPLOY}",
              "STAGE": "staging",
              "GIT_COMMIT_SHA": "${GIT_COMMIT_SHA}",
              "GIT_COMMIT_REF": "${GIT_COMMIT_REF}",
              "GIT_COMMIT_TAGS": "${GIT_COMMIT_TAGS}",
              "GITHUB_REF_SLUG": "${GITHUB_REF_SLUG}",
              "GITHUB_HEAD_REF_SLUG": "${GITHUB_HEAD_REF_SLUG}",
              "GITHUB_BASE_REF_SLUG": "${GITHUB_BASE_REF_SLUG}",
              "GITHUB_EVENT_REF_SLUG": "${GITHUB_EVENT_REF_SLUG}",
              "GITHUB_REPOSITORY_SLUG": "${GITHUB_REPOSITORY_SLUG}",
              "GITHUB_REF_SLUG_URL": "${GITHUB_REF_SLUG_URL}",
              "GITHUB_HEAD_REF_SLUG_URL": "${GITHUB_HEAD_REF_SLUG_URL}",
              "GITHUB_BASE_REF_SLUG_URL": "${GITHUB_BASE_REF_SLUG_URL}",
              "GITHUB_EVENT_REF_SLUG_URL": "${GITHUB_EVENT_REF_SLUG_URL}",
              "GITHUB_REPOSITORY_SLUG_URL": "${GITHUB_REPOSITORY_SLUG_URL}",
              "GITHUB_SHA_SHORT": "${GITHUB_SHA_SHORT}"
            }
          EOF
            }

            echo "Print generate_post_data():"
            echo "$(generate_post_data)"

            echo "Calling webhook at '$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK'"
            echo "Sending HTTP request (curl):"
            curl POST \
              "$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK" \
              -vs \
              --header "Accept: application/json" \
              --header "Content-type: application/json" \
              --data "$(generate_post_data)" \
              2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

            # XXX See https://stackoverflow.com/a/54225157/2391795
            # -vs - add headers (-v) but remove progress bar (-s)
            # 2>&1 - combine stdout and stderr into single stdout
            # sed - edit response produced by curl using the commands below
            #   /^* /d - remove lines starting with '* ' (technical info)
            #   /bytes data]$/d - remove lines ending with 'bytes data]' (technical info)
            #   s/> // - remove '> ' prefix
            #   s/< // - remove '< ' prefix

          else
            echo "No webhook url defined in 'vercel.$CUSTOMER_REF_TO_DEPLOY.staging.json:.build.env.VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK' (found '$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK')"
          fi

Respondido el 30 de diciembre de 20 a las 15:12

Puede pasar la extensión del formato que desee al final de la URL. igual que http://localhost:8080/xx/xxx/xxxxjson

or

http://localhost:8080/xx/xxx/xxxx.xml

Nota: debe agregar las dependencias jackson y jaxb maven en su archivo pom.

Respondido 16 Jul 18, 10:07

Eso solo funcionaría si el lado del servidor aceptara las URL con esas extensiones. - Marcos Stosberg

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.