¿Cómo publico datos JSON con cURL?
Frecuentes
Visto 3,595 equipos
3341
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;
}
26 Respuestas
5111
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
662
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
124
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
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
110
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
101
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
58
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
49
contestado el 30 de mayo de 19 a las 07:05
44
Simplemente me encuentro con el mismo problema. Podría resolverlo especificando
-H "Content-Type: application/json; charset=UTF-8"
respondido 15 nov., 11:15
39
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
37
Puedes usar Cartero con su GUI intuitiva para ensamblar su cURL
mando.
- Instalar y comenzar Cartero
- Escriba su URL, cuerpo de la publicación, encabezados de solicitud, etc. págs.
- Haga clic en
Code
- Seleccione
cURL
de la lista desplegable - 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
30
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
30
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
22
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
22
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
20
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
17
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
17
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
15
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
13
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
13
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
11
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
9
Hice una herramienta llamada captador para esto. Puede enviar solicitudes y formatear fragmentos de curl:
He aquí un ejemplo:
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
4
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
2
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
1
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
-8
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 json rest spring-mvc curl http-headers or haz tu propia pregunta.
revisar la aquí para solicitudes de publicación de primavera 3.2.0. - AmirHd
Hay una buena publicación Uso de Curl para pruebas ad hoc de microservicios RESTful que cubre esto con múltiples ejemplos. - upitau
ayúdame en esto stackoverflow.com/questions/65359210/… - JaY KuMaR