receive - spring rest api post json
¿Cómo POSTAR datos JSON con Curl desde Terminal/Línea de comando para probar Spring REST? (20)
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
Es posible que le resulte útil resty: https://github.com/micha/resty
Es un CURL redondo envolvente que simplifica las solicitudes REST de la línea de comandos. Lo apunta a su punto final de 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 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 predeterminadas de RESTY
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.
Esto funcionó para mí:
curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
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.
Intente poner sus datos en un archivo, digamos body.json
y luego use
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
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 Windows, tener una comilla simple para el valor -d
no funcionó para mí, pero funcionó después de cambiar a comillas dobles. También necesitaba escapar de comillas dobles entre 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
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 "data=@/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 "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload
Puede pasar la extensión del formato que desee al final de la url. como http://localhost:8080/xx/xxx/xxxx .json
o
http://localhost:8080/xx/xxx/xxxx .xml
Nota: debe agregar las dependencias de jackson y jaxb maven en su pom.
Puede usar Postman con su GUI intuitiva para ensamblar su comando cURL
.
- Instalar e iniciar cartero
- Escriba su URL, cuerpo del mensaje, encabezados de solicitud, etc. pp.
- Haga clic en
Code
- Seleccione
cURL
de la lista desplegable - Copia y pega tu comando
cURL
Nota: hay varias opciones para la generación automatizada de solicitudes en la lista desplegable, por lo que pensé que mi publicación era necesaria en primer lugar.
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 -
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
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 "data=@/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: