Subir ficheros mediante un Webservice REST

1,671 views
Skip to first unread message

jmiguel rodriguez

unread,
Nov 19, 2012, 12:58:21 PM11/19/12
to grailsenc...@googlegroups.com
Hola a todos, 

Me ha surgido la necesidad para una aplicacion de mi empresa de hacer un pequeño módulo que suba ficheros mediante un Webservice REST, asi que he pensado que sería una buena oportunidad de hacerlo con Grails. 

He estado mirando un poco por encima y no he encontrado el típico ejemplo que aclare muchas dudas. Lo que he visto es para subir ficheros desde un GSP con el input type=file pero no es eso exactamente lo que necesito. 

Tengo libertad para elegir la forma en que se subiran los datos (en cada peticion irán algunos variables/valor y, en principio, un unico fichero por peticion), y me da a priori igual xml, json (entiendo que será lo mejor) o parejas de var=valor en la URL

He mirado por encima el plugin jax-rs pero aún no he visto si permite multipart, que entiendo voy a necesitar para esto. Y tambien, no se si con grails nativo, sin plugins, puedo conseguir el mismo resultado, asi que aqui estoy pidiendo consejo.  ¿Alguien ha hecho algo parecido?. ¿Con que tecnologia/plugin?. 

Gracias por adelantado!


Alberto Vilches

unread,
Nov 19, 2012, 1:03:14 PM11/19/12
to grailsenc...@googlegroups.com
No entiendo bien. Quieres...:
1) Hacer un war que tenga un servicio rest, el cual recibe y guarda un fichero que otra persona/cliente sube mediante un cliente rest/http
2) Lo mismo que antes, pero tambien quieres hacer el cliente que lo sube
3) Hacer un war que tenga un formulario donde alguien puede subir un fichero (y aqui no hay rest que valga)


2012/11/19 jmiguel rodriguez <jmiguel....@gmail.com>
--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.



--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

jmiguel rodriguez

unread,
Nov 19, 2012, 1:21:43 PM11/19/12
to grailsenc...@googlegroups.com
Hola Alberto, 

Veo que me he explicado fatal .. :-)

El 19 de noviembre de 2012 19:03, Alberto Vilches <vil...@gmail.com> escribió:
No entiendo bien. Quieres...:
1) Hacer un war que tenga un servicio rest, el cual recibe y guarda un fichero que otra persona/cliente sube mediante un cliente rest/http
2) Lo mismo que antes, pero tambien quieres hacer el cliente que lo sube

Respuesta rápida: 2

Respuesta menos rápida: Estrictamente lo que deberia hacer es solo 1) (mas 'unos cuantos' procesos por detras, pero ahí no tendre problema salvo que me meta en temas de colas ¿rabbitMQ?, que todo puede ser), pero tambien quiero hacer 2) por tener un 'cliente de referencia' para distribuir a quien este interesado en consumir el servicio, que puede -y tal vez debe- ser java. Y de paso puedo hacer mejores pruebas que con, por ejemplo, soapUI. 

Supongo que el cliente ya me dará problemas, pero lo que quiero solucionar de momento es el lado del servidor: recibir con un api REST los valores, el fichero, escribirlo a disco...
 
Gracias!

Alberto Vilches

unread,
Nov 20, 2012, 5:22:07 AM11/20/12
to grailsenc...@googlegroups.com
Ok. Entiendo que lo de querer que el servicio sea REST no es obligatorio. Quiero decir, REST no es un protocolo, ni siquiera es un standard, es una "manera" de hacer las cosas que se suele aplicar a la hora de un api pública (crear las urls para que sean recursos únicos, usar los métodos get/post/put/delete para indicar las operaciones, etc)

Para lo que necesitas, basta con un controller y un action que reciba un fichero como si te lo subiesen por un formulario en un navegador. Para hacer pruebas rápidas con el controller/action, puedes crearte un formulario en un gsp con <g:uploadForm> y así ver como lees el fichero. Más info aquí (es puro Spring): http://www.grails.org/doc/latest/guide/theWebLayer.html#uploadingFiles

Cuando lo tengas, entonces te creas el cliente. Yo me haría un script en groovy con un HttpBuilder (o si quieres tener un cliente de referencia, usaría directamente Java con httpclient, que es lo que usa por debajo httpbuilder)


Parece que no hay doc sobre como usar httpbuilder (la doc es ho-rri-ble, yo muchas veces tiro del código fuente para ver como se hacen las cosas). Aquí tienes un par de cosillas que he visto por ahí:




2012/11/19 jmiguel rodriguez <jmiguel....@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a grailsencastell...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/grailsencastellano?hl=es.

jmiguel rodriguez

unread,
Nov 20, 2012, 5:03:16 PM11/20/12
to grailsenc...@googlegroups.com
Buenas, 

El 20 de noviembre de 2012 11:22, Alberto Vilches <vil...@gmail.com> escribió:
Ok. Entiendo que lo de querer que el servicio sea REST no es obligatorio. Quiero decir, REST no es un protocolo, ni siquiera es un standard, es una "manera" de hacer las cosas que se suele aplicar a la hora de un api pública (crear las urls para que sean recursos únicos, usar los métodos get/post/put/delete para indicar las operaciones, etc)

Correcto. No necesito (como, efectivamente de hecho no hay) infraestructura aparte de 'lo que ya hay', pero nunca he hecho estas cosas, asi que asumia que habia que hacer algo especial. En los ejemplos de jax-rs, por ejemplo, se envia como parámetro un XML, cosa que no necesito.  


Para lo que necesitas, basta con un controller y un action que reciba un fichero como si te lo subiesen por un formulario en un navegador. Para hacer pruebas rápidas con el controller/action, puedes crearte un formulario en un gsp con <g:uploadForm> y así ver como lees el fichero. Más info aquí (es puro Spring): http://www.grails.org/doc/latest/guide/theWebLayer.html#uploadingFiles

Bien. Porque nunca he visto Spring. Pero nunca es tarde  :-) 

Cuando lo tengas, entonces te creas el cliente. Yo me haría un script en groovy con un HttpBuilder (o si quieres tener un cliente de referencia, usaría directamente Java con httpclient, que es lo que usa por debajo httpbuilder)

O sea, que al final los parametros van igual que si fueran por URL: http://xxxx/?param=value1&param2=value2&...  ¿Y el multipart?. 

Bueno, ya me has dado la pista me lo curro por mi cuenta. 

Gracias por la pista y los enlaces. 

-- 

Alberto Vilches

unread,
Nov 20, 2012, 6:29:30 PM11/20/12
to grailsenc...@googlegroups.com
O sea, que al final los parametros van igual que si fueran por URL: http://xxxx/?param=value1&param2=value2&...  ¿Y el multipart?. 

Bueno, ya me has dado la pista me lo curro por mi cuenta. 

Cuando haces un POST, los parámetros no van en la url, sino en el body. De todas formas, tu cliente http (groovy o java) o un formulario te generarán la petición http correctamente, por lo que no tendrás que preocuparte de esos aspectos del protocolo http... :)

-- 

jmiguel rodriguez

unread,
Nov 21, 2012, 10:19:47 AM11/21/12
to grailsenc...@googlegroups.com
El 21 de noviembre de 2012 00:29, Alberto Vilches <vil...@gmail.com> escribió:

O sea, que al final los parametros van igual que si fueran por URL: http://xxxx/?param=value1&param2=value2&...  ¿Y el multipart?. 

Bueno, ya me has dado la pista me lo curro por mi cuenta. 

Cuando haces un POST, los parámetros no van en la url, sino en el body.

 ☆ BAZINGA! ☆

 
Reply all
Reply to author
Forward
0 new messages