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

2042
2017-08-24 08:51


origen


Respuestas:


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

Mirando a la página de hombre 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 utiliza -d, como el -d bandera implica una solicitud POST.


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


3229
2017-08-24 09:12



Intenta poner tus datos en un archivo, di body.json y luego usa

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

424
2017-08-24 10:04



Puede encontrar útil resty: 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: Configurando opciones de RESTY por defecto


86
2018-01-12 19:10



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


69
2018-04-19 16:00



Para Windows, tener una sola cotización para el -d valor 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

58
2018-06-30 22:12



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

37
2018-01-05 23:10



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.


31
2017-07-01 14:31



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

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

26
2017-11-15 15:45