receive - ¿Cómo POSTAR datos JSON con Curl desde Terminal/Línea de comando para probar Spring REST?




spring rest json (14)

Yo 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 un dato JSON. Un ejemplo de datos es 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 la 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

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

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

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

A continuación, ejecute 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

Cree el archivo JSON "MyData.json" y agregue contenido:

[
    {
        "Key_one": "Value_one",
        "Key_two": "Value_two",
        "Key_three": "Value_three"
    }
]

Después de esto, necesitas ejecutar el siguiente comando:

curl -v -H "Content-Type: application/json" -X POST --data @MyData.json -u USERNAME:PASSWORD http://localhost:8000/env/add_server

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

Me encontré con esto nuevamente hoy, usando el cURL 7.49.1 de Cygwin para Windows ... Y cuando --data o --data-binary con un argumento JSON, cURL se confundió e interpretaría el {} en el JSON como una URL modelo. La adición de un argumento -g para desactivar el CURL globbing solucionó eso.

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


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.


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

use -F 'json data'

Asumamos este formato JSON dict:

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

Ejemplo completo

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

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 asignado 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 de identificación.


Me acabo de encontrar con el mismo problema. Podría resolverlo especificando

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

Necesitas establecer tu tipo de contenido en application / json. Pero -d envía la application/x-www-form-urlencoded Content-Type application/x-www-form-urlencoded , que no se acepta en el lado de Spring.

Mirando la página de 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

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

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

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


Para datos json

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

Si quieres publicar algún archivo.

curl -X POST -F "[email protected]/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload --insecure

En caso de que no quieras meterte con https y http:

O simplemente,

curl -X POST -F "[email protected]/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload



Si está probando una gran cantidad de envíos / respuestas JSON contra una interfaz REST, es posible que desee revisar el complemento Postman para Chrome (que le permite definir manualmente las pruebas de servicio web) y su comando Newman basado en Node.js -line companion (que le permite automatizar pruebas contra "colecciones" de pruebas de Postman). ¡Tanto gratis como abierto!


Un poco tarde para la fiesta, pero no veo esto publicado, así que aquí va, también puede poner a su json en un archivo y pasarlo a curl mediante la opción de carga de archivos a través de una entrada estándar, como esta:

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

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

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

Pero si tiene una gran cantidad de parámetros, siempre prefiere usar un archivo con el cuerpo de solicitud JSON como se muestra a continuación:

curl -X POST -H "Content-Type:application/json" -F "[email protected]/users/suchi/dekstop/JSON_request.txt" hostname:port/api

HTTPie es una alternativa recomendada para curl porque puede hacer solo

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

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

Some-Header:value

para los encabezados, y

name==value

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

 [email protected]




curl