¿Cómo POSTAR datos JSON con Curl desde Terminal / Línea de Comando hasta Test Spring REST?

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 una información JSON. Un ejemplo de datos es como esto:

{"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 compatible con el recurso solicitado para el método solicitado ().

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

¿Alguna idea sobre el formato correcto del comando Curl?

EDITAR:

Este es mi código PUT 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; } 

Debe configurar su tipo de contenido para application / json. Pero -d envía la application/x-www-form-urlencoded Content-Type application/x-www-form-urlencoded , que no es aceptada por Spring.

Si miras la página man 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 

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

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


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

Trate de poner sus datos en un archivo, diga body.json y luego use

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

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

Es un CURL de envoltura redondo que simplifica las solicitudes de REST de línea de comando. Lo dirige a su punto final API, y le 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 todavía es necesario agregar los encabezados de tipo de contenido. Sin embargo, puede hacer esto una vez para establecer un valor predeterminado, agregar archivos de configuración por método por sitio: Establecer opciones de RESTY predeterminadas

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 de 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 POJO simple con una propiedad de identificación.

Para Windows, tener una cotización simple para el valor -d no funcionó para mí, pero funcionó después de cambiar a comillas dobles. También necesitaba escapar las comillas dobles dentro de las 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 

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 

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.

Me encuentro con el mismo problema. Podría resolverlo especificando

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

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 

Si está probando una gran cantidad de envío / respuestas JSON contra una interfaz RESTful, es posible que desee verificar el complemento de Postman para Chrome (que le permite definir manualmente las pruebas del servicio web) y su comando Newman basado en Node.js. -line compañero (que le permite automatizar pruebas contra “colecciones” de pruebas de cartero.) ¡Ambos libres y abiertos!

Puede usar Postman con su GUI intuitiva para ensamblar su comando cURL .

  1. Instalar y comenzar cartero
  2. Escriba su URL, cuerpo del mensaje, encabezados de solicitud, etc.
  3. Haga clic en Code
  4. Seleccione cURL de la lista desplegable
  5. copie y pegue su comando cURL

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.

Esto funcionó bien para mí, adicionalmente con la autenticación BASIC:

 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 de nuevo hoy, usando Cygwin’s cURL 7.49.1 para Windows … Y al usar --data o --data-binary con un argumento JSON, cURL se confundió e interpretaría el {} en el JSON como una URL modelo. Agregar un argumento -g para desactivar el cotroling de cURL solucionó eso.

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

Esto funcionó para mí:

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

Llegué un poco tarde a la fiesta, pero no veo esto publicado, así que aquí va, también puedes poner tu json en un archivo y pasarlo a curl usando la opción –file-upload a través de la entrada estándar, como esta:

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

HTTPie es una alternativa recomendada para curl porque puedes hacer solo

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

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

 Some-Header:value 

para encabezados, y

 name==value 

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

  field=@file.txt 

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

 use -F 'json data' 

Supongamos este formato dict JSON:

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

Ejemplo completo

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

Para datos json

curl -H "Content-Type: application/json" -X POST -d '{"params1":"value1","param2":"value2"}' http://localhost:8080/api

Si quieres publicar un archivo

curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload --insecure

En caso de que no quiera estropear con https y http:

O simplemente,

curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload

Yo uso JSON en mi aplicación y es simple como:

 curl -X POST -H "Content-Type:application/json" -d '{"params1":"value1","params2":"value2"} hostname:port/api 

Pero si tienes una gran cantidad de params, siempre prefieres usar un archivo con el cuerpo de la solicitud JSON como se muestra a continuación:

 curl -X POST -H "Content-Type:application/json" -F "data=@/users/suchi/dekstop/JSON_request.txt" hostname:port/api 

Puede pasar la extensión del formato que desea como el final de la url. como http: // localhost: 8080 / xx / xxx / xxxx .json

o

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

Nota: necesitas agregar las dependencias de jackson y jaxb maven en tu pom.