Como empezar con WebServices

Hola!
Soy nuevo en java y estoy tratando de crear unos webservices para un proyecto en especifico. He estado leyendo varias cosas sobre webservice pero cada vez que leo mas me pierdo. No se cuantas cosas diferentes he leido para esto desde Axis1,2 Jax, Metro la verdad ya ni se que hacer. Siempre he creido que esta es una de las cosas que hacen que Java no se propague mas no exiset una forma simple de empezar. Me he leido toda la documentacion de los webservices y la verdad no es nada del otro mundo pero en Java existe una adversacion de complicar todo.

Tengo instalado Tomcat5.5, Java6, eclipse-jee-indigo-win32 y Postgres y debo hacer un par de webservices ahora la pregunta es, para un newbie cual seria el mejor camino para empezar.?

He probado tanto y leido tanto que la verdad ya estoy frustrado y hasta he pensado en hacer esto en PHP o .NET pero quiero trabajar en Java y ya he hecho muchas cosas en java y quiero quedarme en el.

Solo pido que como ustedes tienen mas experiencia que yo me den una guia para desarrollar esto entre AXIS, Metro, JAX-WS me estoy volviedno loco.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

JAX-WS

Bueno. Esto me recuerda el mismo caso de un amigo... le dije: para que sientas un consuelo de que creaste un WS abre tu IDE y crea un proyecto web y despues agregale un WS y hazle su webMethod y ejecuta tu proyecto con el tester
   
Tu pensaras que hablo raro, que nosabes que es eso del webMethod que no le entiendes y que por eso no has hecho nada y bueeeeno... el consejo es tranqulizate que ese es un tema que encuentras ya resuelto en muchos lugares como en este http://java.dzone.com/articles/jax-ws-hello-world
   
Si quieres aprender platicanos como lo haces para ver donde fallas y que no te sale para que asi podamos recomendarte una solucion (bueno yo usaria JAX-WS porque es bien bien bieeen pero bieeeeen facil de usar)
   
por cierto:

estoy frustrado y hasta he pensado en hacer esto en PHP o .NET

haces creer que esos lenguajes son solo para perdedores. Si lo dices porque es bastnante sencillo en Php o .net te daras cuenta que en Java tambien lo es

   


Editado

Si qieres algo sobre RESTful este ejemplo está completisimo y usa JAX-RS: http://www.vogella.de/articles/REST/article.html

Coincido contigo, muchas

Coincido contigo, muchas veces es difícil saber donde empezar y la información que se encuentra en internet mucha veces es blah, blah, blah. Y luego los que saben dicen: Bah, es tán fácil, que ni te lo voy a decir.

Pues bueno, mala noticia para tí yo no te puedo aportar mucho en este tema. La mayoría de las veces que he necesitado un webservice ( el 90% de las veces ) ha sido de la mano de alguna herramienta donde hay un menú que dice: "Exponer como webservice" o "Consumir webservice" y en esta última viene un campo de texto donde puedes pegar el WSDL.

Lo que sí sé, es que en el JDK ( ejem en el Java SDK ) vienen dos herramientas que pueden servir y podrías explorar wsgen y wsimport échales un ojo.

También si te sirve de algo Axis2 es el framework más usado y quizá deberías enfocar tus esfuerzos en eso. Si utilizas algún Application Server ( como Websphere, Weblogic o JBoss ) la mayoría tiene algún mecanismo para exponer/consumir webservices.

Finalmente el último lugar donde quieres ir es hacerlo tu mismo utilizando la biblioteca JAX-WS por el simple hecho de que es un biblioteca de "bajo" nivel, comparado con usar herramientas que te generen.

Espero que esto te ayude de algo y quizá alguien más pueda venir a complementar.

Imagen de ezamudio

diseña, diseña, diseña

Primero que nada, diseña muy bien tu servicio. No te preocupes al principio por el web service. En cierta forma, un web service no es más que una manera de exponer métodos de un componente, para que sea invocables via HTTP. Así que lo primero que necesitas, es tener algo que exponer.

Diseña tu componente, haciendo una interfaz primero; define los métodos que necesitas exponer, los parámetros que van a recibir, los valores de retorno, etc.

Luego crea tu componente, implementando la interfaz que definiste. Haz pruebas unitarias, todo lo que se te ocurra de cada método, qué pasa cuando le envías parámetros en null, cadenas vacías, números inválidos, valores fuera de rango, etc etc. Asegúrate que sea un componente sin estado, de modo que una sola instancia pueda ser utilizada por varios hilos al mismo tiempo. Una prueba de stress te servirá mucho.

Una prueba de stress no es tan complicada de hacer. Debes crear una clase que implemente Runnable, tenga una referencia al componente que vas a probar, y en el run() invoque los métodos que quieres probar (similar a pruebas unitarias, pero puedes invocar todos los métodos uno tras otro, y verificar en cada llamada que los resultados obtenidos son los esperados). Luego haces un programa donde creas y configuras tu componente, luego creas unos cuantos cientos de tu Runnable, apuntando al componente, y luego los echas a andar: por cada Runnable, puedes crear un Thread que lo tenga como target y luego echar a andar todos los threads, o puedes crear un ExecutorService de unos 50 hilos máximo y aventar todos tus Runnables ahí para que se ejecuten máximo de 50 en 50 y los demás se encolen. Con eso le puedes poner una buena friega a tu componente y asegurar que no se baten los datos, que no tenga estado (por eso es importante que cada Runnable verifique que los resultados obtenidos son los esperados).

Cuando ya tengas todo eso, queda la parte tediosa: publicar el componente como un web service. Ahí tienes varias opciones: puedes decorar tu componente con las anotaciones de web services de Java6 (creo que eso sirve para varias de las opciones de hecho), y luego puedes usar Axis2 para crear un stub que sirve de frontend para tu componente, o seguir el blog de willyxost que indica cómo crear y publicar un web service con JavaSE 6. O puedes ver mi guía para crear un web service políglota con Spring (no lo tienes que hacer políglota si no quieres, puedes hacer en Java solamente, y lo de Spring te sirve igual). O ver las guías de Apache CXF, Axis y los otros frameworks que mencionas. Todos hacen lo mismo al final: Toman el componente que ya tienes listo y lo exponen como un web service. Pero es esencial que ya tengas tu componente bien hecho y probado; después lo puedes exponer como web service, o como servicio RMI o lo que sea.

Para que hagas un buen web service, es necesario un buen diseño de tus componentes, así que por favor lee mi guía/queja sobre cómo NO hacer web services.

Imagen de macaruchi

Gracias por tu respuesta.

Gracias por tu respuesta. Bueno, con respecto al diseno lo hice es mas esta desarrollado como una clase java y la interfaz que deseaba implementada pero entre tantas cosas que he leido alguien decia que eso era una mala practica , que no era buena idea, etla primerc, y que era mejor desarrollar primero la interfaz WSDL. Entiendo que eso es cierto primero la interfaz luego la implementacion por eso ahi mismo deje eso y empece entonces a liarme con los WSDL, la verdad eso que dicen tiene sentido.

Es decir, la primera parte que me dices la hice y creo que bien. Me baje Axis2 y estoy peliandome con ella ahora viendo unos metodos para generar el WSDL directamente desde linea de comando en linux con Java2WSDL y WSDL2Java

Sobre lo de Runnable no entiendo mucho esa parte y el asunto de crear los Thread para las preubas de streees pero creo que es buena idea, tengo que leer sobre eso ahora.

Lo del webserivice poliglota no se que es y menos que es Spring he tratado de evitar lo mas posible a ese Sr. :P

No se si es mejor primero hacer el WSDL o los metodos porque no soy experto en esto y me llevo de todo el que me de una pista. EN estos momentos estoy usando este tutorial http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=WSDL2Java para hacerlo o al menos entenderlo bien.

Me leere las cosas que me enviaste a leer para seguir teniendo mas ideas de lo que me estoy metiendo. IMHO, creo que tengo bien claro lo que es un webservice es mas he implementado cosas como estas , no propios WS, pero si metrodos ejecutandose via http y https pero aqui quiero hacer bien las cosas por eso me meti en Java. Creo, que deberia haber, al menos, guias de implementacion un poco mas clara. Desde que empiezan hablar de todas esas tecnologias existentes me da un dolor de cabeza.

De todas formas gracias a todos los que me contestaron y creanme que voy a seguir los consejos.

Imagen de macaruchi

Bueno, a riesgo de decir un

Bueno, a riesgo de decir un par de disparates aqui voy.
Estoy usando Axis2 no se que es JAX-WS aunque he visto por ahi. Vi el ejemplo que me enviaste y la verdad parece bien facil pero no entiendo mucho sobre las diferencias de uno y otro, la verdad al principio pensaba que los WS se hacian como se hacen en ese ejemplo.

Bueno sobre php y .Net no soy fanatico de ellos aunque he hecho cosas en ellos, pero no son mi primera linea de fuego y la verdad como lo dije fue sin ofensa :P

Imagen de neko069

Chécate éste tutorial

Chécate éste tutorial construyes un WS en 3 minutos....

Imagen de macaruchi

Estoy tratando de hacer el

Estoy tratando de hacer el que me dices aqui con JAX-WS http://java.dzone.com/articles/jax-ws-hello-world pero cuando llego a compilar el wsgen no puedo generar nada.
Estoy trabjando en linux por consola porque no tengo ningun IDE por el momento, excepto PICO y VI

Al llegar a este paso no se a lo que se refiere
5) Run the WSPublisher…. Guess what .. your WebService is published..

No se si compilar o hacer que. Trate de compilar la clase Wpublisher pero me da error.

root@squezze:~/src/juma# javac WSPublisher.java
WSPublisher.java:5: package juma.mohammad does not exist
import juma.mohammad.GreetingImpl;
^
WSPublisher.java:9: cannot find symbol
symbol : class GreetingImpl
location: class juma.WSPublisher
Endpoint.publish("http://localhost:8080/WS/Greeting",new GreetingImpl());
^
2 errors

Imagen de neko069

Ya lo intentaste con la liga

Ya lo intentaste con la liga que te pasé? no se ve difícil, ya tiene un rato que no hago algún WS, y si no estuviera más desocupado, te echaba un ejemplo, qué es lo que llevas??

Imagen de macaruchi

Hola..! Bueno, logre compilar

Hola..!
Bueno, logre compilar todo y generar todo mi problema ahora es hacer el deploy y ponerlo en Tomcat. Es decir, no se como tengo que poner cada cosa o mejor dicho donde tengo que poner cada cosa para el momento de subirlo a Tomcat se puedan accesar estos.
De la forma que los hice me gusto mas porque no tenia que usar ningun IDE ademas de que no eran WS tan dificiles. Esto es como lo tengo ahora

|----web.xml, jaxws.xml
WS---|--WebContent--->WEB-INF---|
| |----wsdl
|
|--- src---met---jaxws y todos los .class y .java

met: es el paquete que hice para mis clases. Ahora lo que necesito saber es como poner todo eso como va y hacer el famoso .WAR para que tomcat lo entienda.
Creo que logre hacer todo el problema es que no se como ponerlo a correr ahora.

Si alguien aca puede darme una manito se los agradecere, recuerden que estoy en Linux consola con el IDE de Vi

Gracias

Imagen de macaruchi

Hola..! Bueno, logre compilar

Hola..!
Bueno, logre compilar todo y generar todo mi problema ahora es hacer el deploy y ponerlo en Tomcat. Es decir, no se como tengo que poner cada cosa o mejor dicho donde tengo que poner cada cosa para el momento de subirlo a Tomcat se puedan accesar estos.
De la forma que los hice me gusto mas porque no tenia que usar ningun IDE ademas de que no eran WS tan dificiles. Esto es como lo tengo ahora

WS

..............................................................|----web.xml, jaxws.xml
WS---|--WebContent--->WEB-INF---|
..........| |----wsdl
..........|
..........|--- src---met---jaxws y todos los .class y .java

met: es el paquete que hice para mis clases. Ahora lo que necesito saber es como poner todo eso como va y hacer el famoso .WAR para que tomcat lo entienda.
Creo que logre hacer todo el problema es que no se como ponerlo a correr ahora.

Si alguien aca puede darme una manito se los agradecere, recuerden que estoy en Linux consola con el IDE de Vi

Gracias

Imagen de macaruchi

WS ..........WebContent .....

WS
..........WebContent
.....................................WEB-INF----> WSDL, web.xml, jaxws.xml

........src
..........................met----->jaxws y todos los .class y .java

disculpa por postear dos veces pero no salia bien el grafico

Imagen de neko069

O sea que estás compilando

O sea que estás compilando por consola? lo digo porque comentas:

De la forma que los hice me gusto mas porque no tenia que usar ningun IDE ademas de que no eran WS tan dificiles.

Entonces, si es por consola, y ya lo compilaste, pues checa, te metes al folder donde tienes tu proyecto

cd WS
y le das
jar -cvf nombreDeTuArchivoWar.war . //el espacio y el punto también van

Con éso, te empaquetas todo el contenido de tu aplicación, ya nada mas sería copiar ése war al directorio de webapps de tomcat, levantar tomcat y verificar que funcione, en su consola...
Cuentas como te fue

Imagen de macaruchi

Si, ahora estoy compilando

Si, ahora estoy compilando por consola en linux. El problema que tengo es que no se donde deberia poner los archivos. Es decir, web.xml donde iria , o el wsdl o los demas para poder crear el jar

Imagen de neko069

Checa ésta entrada para que

Checa ésta entrada para que armes tu war...
Necesitas el wsdl en tu estructura de archivos?, es decir, que no basta con que construyas las clases que componen el cliente? se supone que con eso debería ser suficiente, y a la hora de echar a andar el cliente, el servicio que provee el WS debe de estar desplegado...

Imagen de macaruchi

UHmm..bueno, la verdad no se

UHmm..bueno, la verdad no se que decirte en ese caso. Suponia que el WSDL era necesario para un webservice. De todas formas, voy a revisar el link ahora.

Imagen de neko069

Ok, mira, la cuestión, es,

Ok, mira, la cuestión, es, que tú cuando creas un WS, puedes hacerlo de 2 formas, ya sea mediante código, y que al arrancar el código puedas ver en el navegador su WSDL, o bien, tú te creas el WSDL y a partir de él, puedes crear el código que implementa tooodo lo que tú declaras en tu WS ( los servicios) ésto es sólo para la creación del WS.
Para crear el cliente, ya es otra cosa, debes de tener la URL del WS, y a partir de ahi, con el framework/comando que quieras, creas una serie de clases que representan la forma en cómo debes implementar el cliente.
No necesitas el WSDL ,sólo para crear tu cliente, fuera de eso, cuando ya tienes el código del cliente que consumirá el WS lo único que debes de tener, es el WS en funcionamiento (arriba, en servicio, levantado, deployado o como le quieras llamar) pero el WSDL no es necesario en sí, excepto como te digo, para crear el cliente..
Cualquier cosa aquí andamos

Imagen de macaruchi

OK, compile e hice mi primer

OK, compile e hice mi primer war FirstWS, lo copie a la carpeta webapp de mi Tomcat y tomcat lo deployed perfecto. Pero al ir por el navegador
http://10.0.0.46:8080/FirstWS

http://10.0.0.46:8080/FirstWS?wsdl

description The requested resource (/FirstWS/) is not available.

Como podria saber si al menos tomcat esta leyendo en esa carpeta

Gracias de antemano

Imagen de neko069

Excepciones

No te aparece nada más que ése mensaje?
Checa la carpeta de logs de tomcat, a ver si aparece algo más descriptivo.
Por cierto, puedes poner algo de código de cómo hiciste tu WS y cómo lo configuraste? entre tags de < code >, por favor

Imagen de macaruchi

No me aparece mas nada. Si

No me aparece mas nada. Si quieres puedo enviarte el .war que genere o los fuentes como quieras voy a revisar los log de tomcat
Esto es lo que tengo en catalina.out de hoy

Jul 30, 2011 8:25:09 AM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Jul 30, 2011 8:25:09 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 14698 ms
Jul 30, 2011 8:25:09 AM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Jul 30, 2011 8:25:09 AM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.28
Jul 30, 2011 8:25:09 AM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor ROOT.xml
Jul 30, 2011 8:25:11 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive FirstWS.war
Jul 30, 2011 8:25:12 AM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Jul 30, 2011 8:25:12 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3048 ms

Para hacer el WS use este ejemplo mas las instrucciones que ustedes me han ido dando aqui basicamente las de poner todo en su lugar

Imagen de macaruchi

Al fin pude realizar mi WS

Al fin pude realizar mi WS sin los m... IDE todo por consola. Funciona perfecto y como dijeron no era tan dificil pero hay tantas porquerias en internet que lo que terminas es poniéndote loco. Al menos, ya se como hacerlos y publicarlos, aun no lo hago en Tomcat, pero no creo que sea ya muy dificil cuando lo haga quiero escribir un documento para publicarlo para que alguien que empiece como yo no sufra tanto. Se puede publicar aqui ?

A todos muchas gracias, y como dije que lo mejor fue no usar ningún IDE.

Imagen de neko069

Vientos!!, esperamos tu

Vientos!!, esperamos tu publicación