2008-11-15 15 views
35

Tengo un servicio web SOAP muy simple que necesito consumir desde un cliente Java. ¿Cuál es la forma más fácil de lograr esto sin utilizar bibliotecas de terceros? Un requisito es que el host y el puerto se lean desde web.xml antes de cada llamada al ws.Simplemente consumiendo un servicio web en Java

Respuesta

1

¿Sin usar ninguna biblioteca de terceros? Conozca muy bien el estándar SOAP y aprenda a amar SAX.

Si no puede amar a SAX, entonces laxe su requisito de no-third-party-libs y use StAX (con woodstox) en su lugar.

Este enfoque podría ser el "más fácil" (considerando el requisito de no-third-party-libs) pero no creo que sea fácil.

+0

No entiendo por qué sería tan difícil? Seguramente todo lo que tiene que hacer es construir la solicitud utilizando un buffer de cadena, abrir una conexión y luego completar la solicitud y esperar una respuesta. ¿O me estoy perdiendo algo aquí? – Deano

+5

Lo que puede faltar es la dificultad/tedio de construir la solicitud usando StringBuffer. Ciertamente es posible, pero no lo recomendaría. Lo mismo aplica para leer la respuesta sin una biblioteca SOAP. –

8

Si puede relajar su requisito de "no hay bibliotecas de terceros" y tiene un WSDL para el servicio web, Axis lo hace realmente fácil. Simplemente compile el WSDL usando wsdl2java, y puede usar las clases Java generadas para consumir el servicio web.

22

Dependiendo de la versión de JAVA que esté utilizando, parte de la JAX-WS está incorporada. JDK 6 tiene la implementación estándar JAX-WS de Java y puedes usarlo.

ver lo siguiente:

+0

JAX-WS parece muy fácil de usar, pero ¿cómo se puede utilizar para leer el nombre de host del archivo web.config? – Deano

24

I puedo recomendar tu biblioteca CXF El uso que usted tendrá varias opciones para llamar servicios web:

  1. Uso dynamic proxy para llamar (no es necesario para hacer talones de Java usando wsdl2java).

    DynamicClientFactory dcf = DynamicClientFactory.newInstance(); 
    Client client = dcf.createClient("http://admin:[email protected]:8080"+ 
               "/services/MyService?wsdl"); 
    Object[] a = client.invoke("test", ""); 
    System.out.println(a); 
    
  2. Uso de talón de Java generado a partir de WSDL, utilizando wsdl2java.

  3. Si el servidor se ha creado usando CXF puede volver a utilizar el código de interfaz de forma directa (en lugar de utilizar wsdl2java en el WSDL que fue creado a partir de la interfaz!)

Por tanto # 2 y # 3, el siguiente código ejemplifica el uso de CXF:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setAddress("http://admin:[email protected]:8080/services/MyService"); 
factory.setServiceClass(ITest.class); 
ITest client = (ITest) factory.create(); 
client.test(); 
+0

¿La DynamicClientFactory requiere que cree primero el stub? – vikasde

+2

No, puede ejecutar dinámicamente métodos desde el archivo wsdl, pasar parámetros, obtener resultado (objeto escalar o xml). – FoxyBOA

Cuestiones relacionadas