Comprender Los Servicios Web, Parte 2 - Web Services Description Language (WSDL)
Comprender Los Servicios Web, Parte 2 - Web Services Description Language (WSDL)
Nicholas Chase
Publicado en 08-08-2011
Contenido de la serie:
Antes de comenzar
Este tutorial está diseñado para que usted pueda comprender Web Services Description
Language (Lenguaje de descripción de servicios web - WSDL). Está pensando para
desarrolladores que desean exponer sus propios servicios al uso de otros utilizando WSDL y
también para desarrolladores que tengan el archivo WSDL para un servicio al que desean
acceder y necesitan crear un cliente.
Para poder interpretar este tutorial usted debería tener conocimientos básicos de SOAP, los
que puede obtener leyendo la Parte 1 de esta serie de tutoriales; y además conocimientos
básicos de XML. WSDL es un lenguaje de programación agnóstico, pero las muestras que
aparecen al final del tutorial usan Java y el proyecto Apache Axis2. Sin embargo, los conceptos
se aplican a cualquier lenguaje de programación y entorno. Asimismo, el tutorial se focaliza en
WSDL 1.1 que es la versión que más se implementa comúnmente, pero los conceptos son los
mismos para la próxima versión WSDL 2.0 y cubren las diferencias básicas.
Esta serie de tutoriales enseña los conceptos básicos de los servicios web a través de las
peripecias de un periódico de ficción, el Daily Moon, ya que los empleados usan los servicios
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 1/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
web para crear un sistema de flujo de trabajo para aumentar la productividad en estos tiempos
turbulentos.
La Parte 1 comienza simplemente explicando los conceptos básicos de los servicios web y le
muestra cómo usar SOAP, la especificación que sustenta gran parte de lo que está por ocurrir,
conectando al Departamento de Avisos Clasificados con el Sistema de Gestión de Contenidos.
Las Partes 4 y 5, WS-Security y WS-Policy plantean el objetivo de asegurar los servicios del
periódico y los cambios que deben realizar los equipos de trabajo para acceder a esos servicios
recientemente asegurados.
Por último, la Parte 7 muestra cómo usar Business Process Execution Language (WS-BPEL)
para crear aplicaciones complejas partiendo de servicios individuales.
Ahora analicemos más detalladamente los temas que abarca este tutorial.
La Parte 1 de esta serie, Understanding web services: SOAP [Comprender los servicios web:
SOAP], presentó al personal del periódico de ficción llamado Daily Moon. Específicamente, se
conoció al Departamento de Avisos Clasificados. En ese tutorial, el Departamento de Avisos
Clasificados construyó un cliente para enviar y recibir mensajes SOAP al servicio web que
representa el Sistema de Gestión de Contenidos. Este tutorial, el Departamento de Avisos
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 2/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Clasificados impactado por lo que vieron, decide construir su propio servicio web para tomar y
administrar los avisos en la base de datos de clasificados. Sin embargo, para poder usar el
servicio necesitarán crear un archivo Web Services Description Language (WSDL). Este
archivo brinda las instrucciones a aquellos que construyen clientes para que puedan saber qué
mensajes espera y arroja el sistema.
Los conceptos básicos del esquema XML que se incluye en los archivos WSDL
Cómo generar un archivo WSDL automáticamente a partir de una clase Java que
representa un servicio
Cómo generar una clase Java que represente un servicio a partir de un archivo WSDL
El Departamento de Avisos Clasificados construirá un servicio que tome avisos nuevos, edite y
visualice avisos existentes y cierre una edición para que ya no acepte más avisos. Usarán
mensajería unidireccional y también mensajes de solicitud y respuesta.
La carga de este tutorial es conceptual, pero para seguir de manera correcta el código hasta el
final de este tutorial, necesitará contar con el siguiente software instalado:
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 3/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Apache Geronimo u otro servidor de aplicaciones-- El equipo crea un nuevo servicio web en
el transcurso de este tutorial y usted necesitará una aplicación en la cual ejecutarlo. Como se
supone que generalmente los servicios web son interoperables, no importa cuál de ellos use.
Este tutorial demuestra el uso de Apache Geronimo que también es la base para WebSphere
Community Edition de IBM. Usted también puede usar otros servidores de aplicaciones como
WebSphere application server. Puede descargar Apache Geronimo
desde http://geronimo.apache.org/downloads.html. Para obtener más información acerca de la
instalación de Geronimo, consulte el primer tutorial de esta serie, "Understanding web services
specifications, Part 1: SOAP (Comprender las especificaciones de los servicios web, Parte 1:
SOAP)."
Apache Axis2 versión 0.95 o superior -- Puede crear mensajes SOAP manualmente, y puede
interpretarlos manualmente, pero es mucho más fácil tener una implementación a mano. Este
tutorial demuestra el uso de Apache Axis2, el cual contiene implementaciones de varias API
relacionadas con SOAP para facilitarle significativamente la tarea. Puede descargar Apache
Axis2 en http://ws.apache.org/axis2/download.cgi. Este tutorial usa la versión 0.95, pero otras
versiones posteriores pueden funcionar. (Obsérvese que la Parte 1 de esta serie usó la versión
0.94, pero no se probó con el código en esta parte.)
Java 2 Standard Edition versión 1.4 o superior -- Todas estas herramientas se basan en
Java ya que éstos son los servicios y los clientes que usted creará en este tutorial. Puede
descargar J2SE SDK desde http://java.sun.com/j2se/1.5.0/download.jsp.
También necesitará un navegador Web y un editor de texto, pero seguramente ya los tenga. Si
lo desea, también puede usar un entorno de desarrollo integrado (IDE) como Eclipse, pero
como nos estamos concentrando en las tecnologías más que en las herramientas, sólo
usaremos un editor de texto y la línea de comandos para editar y compilar nuestros archivos.
Generalidades
Antes de profundizar en los detalles, analicemos el panorama general.
Los servicios web ofrecen un medio basado en texto (en realidad, basado en XML) para
transferir mensajes enviados y recibidos, esto significa que sus aplicaciones no sólo son
independientes de las máquinas, sino también del sistema operativo y del lenguaje de
programación. Siempre y cuando ambas partes sigan los estándares de servicios web, no
importa qué software se esté ejecutando en ambos extremos.
Existen varios estándares para transferir esta información, pero esta serie de tutoriales se basa
en SOAP debido a su flexibilidad y al uso de estándares más avanzados.
Actualización de SOAP
Un mensaje SOAP consta de tres partes principales: un Encabezado, el Cuerpo y la carga útil
que está incluida en el cuerpo. Consideremos el siguiente ejemplo:
1 >SOAPenv:Envelope
2 xmlns:SOAPenv="http://schemas.xml
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 >SOAPenv:Body<
6 >req:getNumberOfArticles xmlns:req="ht
7 >req:category<classifieds>/req:cate
8 >/req:getNumberOfArticles<
9
10 >/SOAPenv:Body<
11 >/SOAPenv:Envelope<
El mensaje general se llama Sobre, el contenido del cual consta de Encabezado y Cuerpo. El
Encabezado contiene información sobre el mensaje propiamente dicho, como información de
ruteo o información destinada al procesamiento por parte de “intermediarios SOAP”, o servicios
entre el remitente y el destinatario final, quien puede procesar el mensaje. El Cuerpo del
mensaje incluye la “carga útil” que a su vez incluye los datos reales que se transmitirán al
servicio web.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 5/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Cuando usted crea un servicio, comúnmente lo hace porque desea que la gente lo use. Para
que puedan hacerlo, necesitan saber qué información deben enviar al servicio, qué información
arrojará el servicio y dónde encontrar el servicio en primer lugar. Por supuesto que usted puede
poner esto en un documento de procesamiento de texto, pero es mucho más útil tener un
formato estándar para esta información, preferentemente que pueda ser leído por humanos y
por máquinas.
WSDL brinda este formato estándar. La ventaja principal, además de eliminar ambigüedad, es
el estándar de hecho y está en XML, puede ser leído por máquinas hasta tal punto que permite
crear clientes (e incluso hasta el esqueleto de un servicio) automáticamente. El Departamento
de Avisos Clasificados va a crear un servicio que acepte y administre avisos clasificados y para
permitir que otros como los Sitios Web de agregación de empleos usen más fácilmente el
servicio, también lo describirán usando un archivo WSDL.
Durante el transcurso de este tutorial, aprenderá sobre WSDL siguiendo al personal del
Departamento de Clasificados de Daily Moon a medida que creen su propio servicio y lo
expongan al uso de otros.
Primero, Christine toma esquemas XML, lo cual define los datos que pueden aparecer en el
mensaje SOAP. Luego, Larry arma la estructura de un archivo WSDL real para comprender qué
información enviarán y recibirán. Posteriormente, Gene toma el archivo WSDL y lo usa como
inspiración para una clase Java que representa al servicio y luego, sólo para estar seguro, usa
Axis2 para generar un archivo WSDL a través de la clase Java para observar las diferencias. A
partir de aquí, Francis toma el archivo WSDL y lo usa para generar el servicio web básico y un
cliente para acceder a ese servicio web.
Comience ya.
Daily Moon es un periódico muy pequeño y como tal el Departamento de Avisos Clasificados no
puede solventar un Administrador de Bases de Datos (DBA) exclusivo, por lo tanto, Christine
siempre consideró a la base de datos como a “su bebé”. Después de mirar las especificaciones
para WSDL, ella decide asumir la tarea de definir los datos que pueden ir en los mensajes
SOAP.
Validación y opciones
El personal ya está familiarizado con XML después de su incursión inicial en los servicios web,
así que el próximo paso lógico es que Christine aprenda sobre validación.
Obsérvese que la palabra “esquemas” no está con mayúscula en el párrafo anterior porque en
este caso estoy hablando sobre el uso general del término que significa la estructura específica
para un documento, a diferencia de cualquier idioma para documentar esa estructura. El
esquema que más comúnmente soporta estos esquemas XML es el lenguaje de Esquema
W3C XML que habitualmente se conoce simplemente como Esquema XML. (Obsérvese el uso
de mayúscula.)
Christine ve que usarán Esquema XML para construir su documento WSDL 1.1, pero nota que
WSDL 2.0 específicamente soporta otros esquemas, como RELAX NG y Schematron que se
pueden usar en su lugar.
El documento de prueba
Christine comienza con un documento de muestra que se aproxima a los datos que estima que
entrarán y saldrán del sistema. Toma un par de avisos existentes y crea el XML:
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 7/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Este documento se conoce como “documento de prueba”, representa los datos que serán
definidos por el esquema XML. En este caso, consta de dos elementos ClassifiedAd como
elemento secundario de ClassifiedList. Cada ClassifiedAd incluye un atributo adId que
corresponde a la clave primaria dentro de la base de datos, el contenido del aviso, y la fecha de
inicio y fecha de finalización del aviso.
El esquema básico
El próximo paso de Christine consiste en crear los documentos de esquema básico para poder
probar el sistema. El esquema actual propiamente dicho también es un documento XML, así
que ella crea el archivo básico, classifieds.xsd, y un elemento de esquema único, como se
observa en el Listado 3:
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 8/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
1 <xsd:schema
2 xmlns:xsd="http://www
3 </xsd:schema>
Este elemento funcionará como el elemento principal para todas las definiciones que cree
Christine.
El próximo paso, en la prueba del sistema, es armar una aplicación Java simple que validará el
documento de prueba comparándolo con el esquema. Todo lo que tiene que hacer la clase es
especificar la validación y analizar el documento, como se muestra en el Listado 4.
1 import java.io.File;
2 import java.io.IOException;
3 import javax.xml.parsers.DocumentBuilder
4 import javax.xml.parsers.DocumentBuilder
5 import javax.xml.parsers.ParserConfigura
6 import org.w3c.dom.Document;
7 import org.xml.sax.SAXException;
8
9 public class ValidateWithSchema {
10
11 public static void main(String args[
12
13 DocumentBuilderFactory dbf =
14 DocumentBuilderF
15 dbf.setValidating(true);
16
17 dbf.setAttribute(
18 "http://java.sun.com/xml/jaxp/
19 "http://www.w3.org/2001/XMLSch
20 dbf.setAttribute(
21 "http://java.sun.com/xml/jaxp/
22 "classifieds.xsd");
23
24 Document doc = null;
25 try{
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 9/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Christine guarda el archivo y lo compila, y después de ejecutarlo, obtiene los siguientes datos
de salida, como se muestra en el Listado 5.
La Advertencia no es importante; Christine sólo quiere saber si el archivo es válido o no, así
que no necesita ninguna función especial para administración de errores. El Error es
importante porque significa que el analizador en realidad está mirando el esquema y validando
el documento de prueba.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 10/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Es fácil definir los primeros elementos. Los elementos content, endDate y startDate constan
de cadenas simples, como se muestra en el Listado 6.
1 <xsd:schema xmlns:xsd="http://www.w3.org/
2
3 <xsd:element type="xsd:string" name="c
4 <xsd:element type="xsd:string" name="e
5 <xsd:element type="xsd:string" name="s
6
7 </xsd:schema>
En este caso, Christine definió tres elementos que sólo tienen texto (a diferencia de otros
elementos) como contenido. Además, ninguno de ellos tiene atributos. La Recomendación de
Esquema XML define una serie de tipos diferentes que usted puede usar para definir su
contenido. Por ejemplo, puede especificar que los valores endDate y startDate deben ser
valores datetime.
Resulta obvio que si todos los elementos fueron tan simples, probablemente no habrá
necesitado un esquema en primer lugar. Christine avanza para definir el
elemento ClassifiedList (ver Listado 7).
1 <xsd:schema xmlns:xsd="http://www.w3.org
2
3 <xsd:element name="ClassifiedList">
4 <xsd:complexType>
5
6 <xsd:sequence>
7 <xsd:element name="ClassifiedAd
8 t
9
10 </xsd:sequence>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 11/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
11
12 </xsd:complexType>
13 </xsd:element>
14
15 <xsd:complexType name="ClassifiedAdType"
16 <xsd:sequence>
17 <xsd:element type="xsd:string" na
18
19 <xsd:element type="xsd:string" na
20 <xsd:element type="xsd:string" na
21 </xsd:sequence>
22 </xsd:complexType>
23
24 </xsd:schema>
Hasta el momento, con tan solo estas dos definiciones, ella cubrió la mayor parte de la
estructura del documento. Ahora todo lo que necesita es agregar una definición para el
atributo adId.
Agregar atributos
1 <xsd:schema xmlns:xsd="http://www.w3.org
2
3 <xsd:element name="ClassifiedList">
4 <xsd:complexType>
5 <xsd:sequence>
6 <xsd:element name="ClassifiedAd
7 type="ClassifiedAdType"/>
8 </xsd:sequence>
9
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 12/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
10 </xsd:complexType>
11 </xsd:element>
12
13 <xsd:complexType name="ClassifiedAdType"
14 <xsd:sequence>
15 <xsd:element type="xsd:string" na
16 <xsd:element type="xsd:string" na
17
18 <xsd:element type="xsd:string" na
19 </xsd:sequence>
20 <xsd:attribute name="adId" type="xsd:
21 </xsd:complexType>
22
23 </xsd:schema>
En este caso, Christine limitó el contenido del atributo adId a números enteros. Sin embargo,
podría crear un tipo más restrictivo.
Uso de simpleTypes
El Esquema XML ofrece una gran potencia cuando se trata de definir el contenido real que
puede tener su documento. Por ejemplo, Christine puede especificar que el atributo adId debe
contener sólo números enteros superiores o iguales a 1000 (ver Listado 9).
1 <xsd:schema xmlns:xsd="http://www.w3.org
2
3 ...
4
5 <xsd:complexType name="ClassifiedAdType"
6 <xsd:sequence>
7 <xsd:element type="xsd:string" na
8 <xsd:element type="xsd:string" na
9
10 <xsd:element type="xsd:string" na
11 </xsd:sequence>
12 <xsd:attribute name="adId" type="thou
13 </xsd:complexType>
14
15 <xsd:simpleType name="thousandOrGreater"
16 <xsd:restriction base="xsd:integer">
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 13/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
17
18 <xsd:minInclusive value="1000"/>
19 </xsd:restriction>
20 </xsd:simpleType>
21
22 </xsd:schema>
Esta definición no involucra a ningún elemento, así que Christine usa simpleType en lugar de
usar complexType. Ella está creando una restriction -- un límite en el tipo de datos -- con el
tipo de base de números enteros. Luego agrega una “faceta” para esa restricción,
especificando que el valor mínimo es 1000. El Esquema XML permite definir una gran cantidad
de facetas de este tipo para usar. Una vez que ella creó el tipo, puede hacer referencia al
mismo en la definición de atributo. Ahora que ya definió los datos, Christine transfiere el
esquema a Larry para que él pueda construir el WSDL real.
Los mensajes
Los primeros pasos de Larry consisten en decidir qué funciones cumplirá realmente el servicio,
y luego definir los mensajes para los servicios. Después de consultar al resto del departamento,
él obtiene una lista de funciones y sus correspondientes mensajes, y en el resto de esta
sección analizaremos estas funciones.
createNewAd
Esta función toma el contenido del aviso y su fecha de finalización y obtiene la idea para el
aviso recientemente creado (ver Listado 10 y Listado 11).
Listado 10.createNewAdRequest(Input)
1 <env:Envelope
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 14/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 <env:Body>
6 <req:createNewAdRequest
7 xmlns:req="http://daily-mo
8 <req:content>Vintage 1963 T-Bird...
9 <req:endDate>4/30/07</req:endDate>
10
11 </req:createNewAdRequest>
12 </env:Body>
Listado 11.createNewAdResponse(Output)
1 <br>
2 <env:Envelope
3 xmlns:env="http://schemas.xmlSOAP
4 xmlns:xsd="http://www.w3.org/2001
5 xmlns:xsi="http://www.w3.org/2001
6 <env:Body>
7 <res:createNewAdResponse
8 xmlns:res="http://daily-mo
9 <res:newAdId>1138</res:newAdId>
10 </res:createNewAdResponse>
11
12 </env:Body>
editExistingAd
Esta función toma un aviso existente y reemplaza su contenido en la base de datos. Devuelve
un valor booleano indicando si la operación se realizó correctamente (ver Listado 12 y Listado
13).
Listado 12.editExistingAdRequest(Input)
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 <env:Body>
6 <req:editExistingAdRequest
7 xmlns:req="http://daily-mo
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 15/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
8 <req:ClassifiedAd>
9 <req:id>1138</req:id>
10
11 <req:content>Vintage 1963 T-Bir
12 <req:startDate>4/1/2007</req:st
13 <req:endDate>4/30/2007</req:end
14 <req:ClassifiedAd>
15
16 </req:editExistingAdRequest >
17 </env:Body>
Listado 13.editExistingAdResponse(Output)
1 <br>
2 <env:Envelope
3 xmlns:env="http://schemas.xmlSOAP
4 xmlns:xsd="http://www.w3.org/2001
5 xmlns:xsi="http://www.w3.org/2001
6 <env:Body>
7 <res:editExistingAdResponse
8 xmlns:res="http://daily-mo
9 <res:isOK>true</res:isOK>
10 </res:editExistingAdResponse>
11
12 </env:Body>
getExistingAds
Esta función devuelve una lista de ClassifiedAds(avisos clasificados) existentes (ver Listado
14 y Listado 15).
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP.
3 xmlns:xsd="http://www.w3.org/2001/
4 xmlns:xsi="http://www.w3.org/2001/
5 <env:Body>
6 <req:getExistingAdsRequest
7 xmlns:req="http://daily
8 </req:getExistingAdsRequest>
9 </env:Body>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 16/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 <env:Body>
6 <res:getExistingAdsResponse
7 xmlns:res="http://daily-mo
8 <res:ClassifiedList>
9 <res:ClassifiedAd>
10 <res:id>1138</res:id>
11
12 <res:content>Vintage 1963 T-Bir
13 <res:startDate>4/1/2007</res:st
14 <res:endDate>4/30/2007</res:end
15 </res:ClassifiedAd>
16
17 <res:ClassifiedAd>
18 <res:id>2883</res:id>
19 <res:content>Championship playo
20 tickets...</res:content>
21 <res:startDate>4/1/2007</res:st
22
23 <res:endDate>4/30/2007</res:end
24 </res:ClassifiedAd>
25 </res:ClassifiedList>
26 </res:getExistingAdsResponse >
27 </env:Body>
finalizeIssue
Esta función es una función "in only" (sólo de entrada) que toma una fecha de emisión y no
arroja ningún dato (ver Listado 16).
Listado 16.finalizeIssueRequest(Input)
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 17/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
5 <env:Body>
6 <req:finalizeIssueRequest
7 xmlns:req="http://dail
8 <req:issueDate>4/10/06</req:issueDa
9 </req:FinalizeIssueRequest >
10
11 </env:Body>
1 <wsdl:definitions xmlns:wsdl="http://sch
2 targetNamespace="http://ws.apache
3
4 <wsdl:types>
5 </wsdl:types>
6
7 <wsdl:message name="createNewAdRequestMe
8 </wsdl:message>
9
10 <wsdl:portType name="ClassifiedServicePo
11
12 </wsdl:portType>
13
14 <wsdl:binding name="ClassifiedServiceBin
15 </wsdl:binding>
16
17 <wsdl:service name="ClassifiedService">
18 </wsdl:service>
19
20 </wsdl:definitions>
Como los mensajes SOAP que define, WSDL está compuesto por XML. Las definiciones
residen dentro del elemento definitions, como podrá ver aquí. Comenzando desde abajo,
defina el atributo service. El atributo service usa un binding(enlace) particular que es una
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 18/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
El elemento definitions define dos espacios de nombres. El primero, que usa el prefijo wsdl:,
brinda un espacio de nombres para los elementos reales que integran al WSDL. El
segundo, targetNamespace, define el espacio de nombres al que pertenecen los elementos
definidos por WSDL.
Larry toma las definiciones que le dio Christine y las coloca en el elemento types, creando un
esquema nuevo dentro del documento, como se muestra en el Listado 18.
1 <wsdl:definitions xmlns:wsdl="http://sch
2 xmlns:ns1="http://org.apache.axis
3 targetNamespace="http://ws.apache
4
5 <wsdl:types>
6 <xs:schema xmlns:xs="http://www.w3.org
7 targetNamespace="http://org.apa
8 elementFormDefault="unqualified
9 attributeFormDefault="unqualifi
10
11 <xs:element type="ns1:ClassifiedAd"
12
13 <xs:complexType name="ClassifiedAd">
14 <xs:sequence>
15 <xs:element type="xs:int" name="
16 <xs:element type="xs:string" nam
17 <xs:element type="xs:string" nam
18 <xs:element type="xs:string" nam
19
20 </xs:sequence>
21 </xs:complexType>
22
23 <xs:element type="ns1:ClassifiedList
24 <xs:complexType name="ClassifiedList
25 <xs:sequence>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 19/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
75
76 <xs:complexType>
77 <xs:sequence>
78 <xs:element type="ns1:Classifi
79 name=
80 </xs:sequence>
81 </xs:complexType>
82 </xs:element>
83
84 <xs:element name="finalizeIssueReque
85 <xs:complexType>
86 <xs:sequence>
87 <xs:element type="xs:string" n
88 </xs:sequence>
89 </xs:complexType>
90
91 </xs:element>
92
93 </xs:schema>
94
95 </wsdl:types>
96
97 </wsdl:definitions>
Comenzando desde arriba, observe que tenemos dos secciones de espacios de nombres. La
primera está dentro del elemento schema propiamente dicho. Aquí Larry define dos espacios de
nombres. El primero con el prefijo xs:, es el espacio de nombres del Esquema XML. El
segundo, targetNamespace, define los espacios de nombres a los que pertenecen las
definiciones creadas por el esquema. En otras palabras, cuando la segunda definición crea un
atributo complexTypellamado ClassifiedAd, esa definición pertenece al espacio de
nombres http://org.apache.axis2/xsd. No obstante, para referirse a ese espacio de
nombres, Larry necesita crear otro alias. Puede ver ese alias en el elemento de definiciones,
con el prefijo ns1:. (Larry podría haber puesto fácilmente esa definición en el elemento de
esquema, pero posteriormente la necesitará fuera del elemento de esquema.) Los dos últimos
atributos, elementFormDefault y attributeFormDefault, indican si los elementos y los
atributos deben tener o no prefijos para espacios de nombres.
Las primeras cuatro definiciones son del esquema que Christine le dio a Larry, pero el resto
define los mensajes que Larry creó anteriormente.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 21/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Con los tipos ya establecidos, Larry puede definir los mensajes que se enviarán y recibirán en
el sobre SOAP (ver Listado 19).
1 <wsdl:definitions xmlns:wsdl="http://sch
2 xmlns:ns1="http://org.apache.axis
3 targetNamespace="http://ws.apache
4
5 <wsdl:types>
6 <xs:schema xmlns:xs="http://www.w3.org
7 targetNamespace="http://org.apa
8 elementFormDefault="unqualified
9 attributeFormDefault="unqualifi
10 ...
11 <xs:element name="createNewAdRequest
12 <xs:complexType>
13 <xs:sequence>
14
15 <xs:element type="xs:string" n
16 <xs:element type="xs:string" n
17 </xs:sequence>
18 </xs:complexType>
19 </xs:element>
20
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 22/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
21 <xs:element name="createNewAdRespons
22
23 <xs:complexType>
24 <xs:sequence>
25 <xs:element type="xs:int" name
26 </xs:sequence>
27 </xs:complexType>
28 </xs:element>
29
30 ...
31 </xs:schema>
32
33 </wsdl:types>
34
35 <wsdl:message name="createNewAdRequestMe
36 <wsdl:part name="part1" element="ns1:c
37 />
38 </wsdl:message>
39
40 <wsdl:message name="createNewAdResponseM
41
42 <wsdl:part name="part1" element="ns1:c
43 </wsdl:message>
44
45 <wsdl:message name="getExistingAdsRespon
46 <wsdl:part name="part1" element="ns1:g
47 </wsdl:message>
48
49 <wsdl:message name="editExistingAdReques
50 <wsdl:part name="part1" element="ns1:e
51
52 </wsdl:message>
53
54 <wsdl:message name="getExistingAdsReques
55 <wsdl:part name="part1" element="ns1:g
56 </wsdl:message>
57
58 <wsdl:message name="editExistingAdRespon
59 <wsdl:part name="part1" element="ns1:e
60 </wsdl:message>
61
62 <wsdl:message name="finalizeIssueRequest
63 <wsdl:part name="part1" element="ns1:f
64 </wsdl:message>
65
66 <wsdl:portType name="ClassifiedServicePo
67 </wsdl:portType>
68
69 <wsdl:binding name="ClassifiedServiceBin
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 23/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
70 </wsdl:binding>
71
72 <wsdl:service name="ClassifiedService">
73 </wsdl:service>
74
75 </wsdl:definitions>
Cada mensaje tiene un name (nombre) para referirse al mismo posteriormente. Dentro de cada
mensaje, usted define una o más parts (partes). Obsérvese que WSDL 2.0 sólo permite
unapart(parte) por message (mensaje), así que Larry cumple aquí con esta pauta.
Cada part(parte) tiene un name (nombre) y el nombre del element (elemento) que compone
esa part (parte). El nombre del elemento se relaciona con los tipos definidos en el
elemento types(tipos). Obsérvese que el nombre del elemento tiene el prefijo ns1:, el prefijo
para los espacios de nombres que coincide con el atributo targetNamespace para el esquema.
En otras palabras, cuando Larry creó la definición para createNewAdResponse, esa definición
se registró en http://org.apache.axis2/xsd namespace, y como el prefijo ns1: también se
refiere también a ese espacio de nombres, usted puede referirse al mismo usando ese prefijo.
Los mensajes no funcionan por sí mismos, así que Larry debe asociarlos con operaciones
específicas. Estas operation s (operaciones) forman parte del atributo portType. El
atributo portType sólo contiene definiciones y no implementaciones. En ese sentido, se parece
mucho a una interfaz. Efectivamente, en WSDL 2.0, el nombre de portType se cambió
por interface. Larry crea una operación para cada una de las funciones (ver Listado 20).
1 <wsdl:definitions xmlns:wsdl="http://sch
2 xmlns:tns=http://ws.apache.org/ax
3 xmlns:ns1="http://org.apache.axis
4 targetNamespace="http://ws.apache
5
6 <wsdl:types>
7 ...
8 </wsdl:types>
9
10 <wsdl:message name="createNewAdRequestMe
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 24/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
11
12 <wsdl:part name="part1" element="ns1:c
13 </wsdl:message>
14
15 <wsdl:message name="createNewAdResponseM
16 <wsdl:part name="part1" element="ns1:c
17 </wsdl:message>
18 ...
19 <wsdl:message name="finalizeIssueRequest
20 <wsdl:part name="part1" element="ns1:f
21
22 </wsdl:message>
23
24 <wsdl:portType name="ClassifiedServicePo
25
26 <wsdl:operation name="finalizeIssue">
27 <wsdl:input message="tns:finalizeIss
28 </wsdl:operation>
29
30 <wsdl:operation name="createNewAd">
31
32 <wsdl:input message="tns:createNewAd
33 <wsdl:output message="tns:createNewA
34 </wsdl:operation>
35
36 <wsdl:operation name="editExistingAd">
37 <wsdl:input message="tns:editExistin
38 <wsdl:output message="tns:editExisti
39
40 </wsdl:operation>
41
42 <wsdl:operation name="getExistingAds">
43 <wsdl:input message="tns:getExisting
44 <wsdl:output message="tns:getExistin
45 </wsdl:operation>
46
47 </wsdl:portType>
48
49 <wsdl:binding name="ClassifiedServiceBin
50 </wsdl:binding>
51
52 <wsdl:service name="ClassifiedService">
53 </wsdl:service>
54
55 </wsdl:definitions>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 25/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Larry crea dos tipos de mensajes. Uno, comofinalizeIssue, es una operación "in-only" (sólo
de entrada) ya que tiene sólo un mensaje de entrada. Ese mensaje, finalizeIssueRequest,
se definió previamente, y como antes, creamos un prefijo nuevo, tns:, para referirnos al
espacio de nombres al que pertenece.
Definición de enlaces
1 <wsdl:definitions
2 xmlns:soap="http://schemas.xmlsoap.org/
3 xmlns:wsdl="http://schemas.xmlso
4 xmlns:tns="http://ws.apache.org/
5 xmlns:ns1="http://org.apache.axi
6 targetNamespace="http://ws.apach
7
8 <wsdl:types>
9 </wsdl:types>
10
11 <wsdl:message name="createNewAdRequestM
12 <wsdl:part name="part1" element="ns1:
13
14 </wsdl:message>
15 ...
16 <wsdl:portType name="ClassifiedServiceP
17
18 <wsdl:operation name="finalizeIssue">
19 <wsdl:input message="tns:finalizeIs
20 </wsdl:operation>
21
22 <wsdl:operation name="createNewAd">
23
24 <wsdl:input message="tns:createNewA
25 <wsdl:output message="tns:createNew
26 </wsdl:operation>
27
28 <wsdl:operation name="editExistingAd"
29 <wsdl:input message="tns:editExisti
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 26/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
30 <wsdl:output message="tns:editExist
31
32 </wsdl:operation>
33
34 <wsdl:operation name="getExistingAds"
35 <wsdl:input message="tns:getExistin
36 <wsdl:output message="tns:getExisti
37 </wsdl:operation>
38
39 </wsdl:portType>
40
41 <wsdl:binding name="ClassifiedServiceBi
42 type="tns:Clas
43
44 <soap:binding transport="http://schem
45
46
47 <wsdl:operation name="createNewAd">
48 <soap:operation soapAction="createN
49
50 <wsdl:input>
51 <soap:body use="literal"
52 namespace="http:/
53 </wsdl:input>
54 <wsdl:output>
55 <soap:body use="literal"
56 namespace="http:/
57 </wsdl:output>
58
59 </wsdl:operation>
60
61 <wsdl:operation name="finalizeIssue">
62 <soap:operation soapAction="finaliz
63 <wsdl:input>
64 <soap:body use="literal"
65 namespace="http:/
66 </wsdl:input>
67
68 </wsdl:operation>
69
70 <wsdl:operation name="editExistingAd"
71 <soap:operation soapAction="editExi
72 <wsdl:input>
73 <soap:body use="literal"
74 namespace="http:/
75 </wsdl:input>
76
77 <wsdl:output>
78 <soap:body use="literal"
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 27/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
79 namespace="http:/
80 </wsdl:output>
81 </wsdl:operation>
82
83 <wsdl:operation name="getExistingAds"
84 <soap:operation soapAction="getExis
85
86 <wsdl:input>
87 <soap:body use="literal"
88 namespace="http:/
89 </wsdl:input>
90 <wsdl:output>
91 <soap:body use="literal"
92 namespace="http:/
93 </wsdl:output>
94
95 </wsdl:operation>
96
97 </wsdl:binding>
98
99 <wsdl:service name="ClassifiedService">
100 </wsdl:service>
101
102 </wsdl:definitions>
Para cada operación, que comparta el nombre que tenía en el atributo portType, Larry ahora
agrega un elemento soap:operation. Este elemento cumple dos funciones: una, indica que
esto es en realidad una operación SOAP; la otra, es para especificar un atributo soapAction,
un encabezado de HTTP que se envíe al comienzo del mensaje SOAP real. El servidor puede
usar este encabezado para rutear la solicitud a la operación apropiada.
Cada operación también define un mensaje input(de entrada) y uno output (de salida), en el
caso de mensajes que sean exclusivamente de entrada, sólo definirán un mensaje input (de
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 28/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
entrada), pero ahora Larry también agrega información SOAP específica. Nuevamente, no se
preocupe por el atributo use; también lo analizaremos en un momento. Este elemento define
además el espacio de nombres para el contenido de la carga útil.
Habiendo definido tanto la interfaz como el enlace, es hora de definir el servicio (ver Listado
22).
1 ...
2 <wsdl:binding name="ClassifiedServiceBin
3 type="tns:Classifie
4
5 ...
6 </wsdl:binding>
7
8 <wsdl:service name="ClassifiedService">
9 <wsdl:port name="ClassifiedServicePort
10 binding="tns:Classif
11 <soap:address location=
12 "http://127.0.0.1:8080/axis2/services/C
13
14 </wsdl:port>
15 </wsdl:service>
16
17 </wsdl:definitions>
Un service(servicio) puede tener más de un punto final, cada uno definido por su propio
elemento port (puerto). El elemento port corresponde a un enlace en particular e incluye
información sobre la forma de acceder al mismo. En este caso, Larry especifica que se puede
acceder al puerto a través de SOAP
en http://127.0.0.1:8080/axis2/services/ClassifiedService.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 29/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Con el servicio ya definido, resta un paso más. Es optativo, pero debería hacerlo. WSDL le
permite agregar un elemento de documentación a cualquier elemento en el documento WSDL.
El Listado 23 ofrece un ejemplo.
1 ...
2 <wsdl:portType name="ClassifiedServicePo
3
4 <wsdl:document>The finalizeIssue opera
5 operation that tells the system
6 more ads for a particular date.
7
8 <wsdl:operation name="finalizeIssue">
9 <wsdl:input message="tns:finalizeIss
10
11 </wsdl:operation>
12 ...
Hay mucha información sobre WSDL, pero éstos son los conceptos básicos. Antes de avanzar,
sin embargo, demos un vistazo rápido a un par de situaciones más avanzadas que podría llegar
a enfrentar.
Pese a que el uso más común de WSDL es definir SOAP en HTTP, de ninguna manera es la
única forma de especificar un servicio web. Por ejemplo, Larry puede crear un enlace que use
SOAP en correo electrónico y lo habilite sólo para la operación finalizeIssue (ver Listado 24).
1 ...
2 <wsdl:binding name="ClassifiedServiceEma
3 type="tns:Clas
4
5 <soap:binding style="document" transp
6
7 <wsdl:operation name="finalizeIssue">
8 <wsdl:input message="tns:finalizeIs
9
10 <soap:body parts="body" use="li
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 30/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
11 </wsdl:input>
12 </wsdl:operation>
13
14 </wsdl:binding>
15
16 <wsdl:service name="ClassifiedService">
17 <wsdl:port name="ClassifiedServicePort
18 binding="tns:Classif
19
20 <soap:address location=
21 "http://127.0.0.1:8080/axis2/serv
22 </wsdl:port>
23
24 <wsdl:port name="ClassifiedServiceEmai
25 binding="tns:Clas
26 <soap:address location="mailto:final
27 </wsdl:port>
28 </wsdl:service>
29
30 </wsdl:definitions>
SOAP y Mime
Otro tópico para el cual la solución no es tan obvia, es el uso de SOAP con adjuntos. Como el
mensaje es más que un mero documento XML, ¿cómo lo especificará usando WSDL? La
respuesta implica el hecho de que el mensaje se envía usando "multipart MIME".
Afortunadamente, usted puede especificar esto en el documento WSDL. Por ejemplo, Larry
quiere especificar una operación en la cual los usuarios que editen un aviso existente, obtengan
un PDF como constancia del aviso (ver Listado 25).
1 ...
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 31/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
2 <wsdl:operation name="editExistingAd">
3 <soap:operation soapAction="editExis
4 style="document" />
5 <wsdl:input>
6 <soap:body use="literal"
7 namespace="http://daily-
8 </wsdl:input>
9 <wsdl:output>
10
11 <soap:body use="literal"
12 namespace="http://daily-
13 <mime:multipartRelated>
14 <mime:part>
15 <soap:body parts="body" use
16 </mime:part>
17 <mime:part>
18
19 <mime:content part="docs"
20 </mime:part>
21 <mime:part>
22 <mime:content part="proof"
23 <mime:content part="proof"
24 </mime:part>
25
26 </mime:multipartRelated>
27 </wsdl:output>
28 ...
En este caso, el mensaje que arroja incluye SOAP, un documento HTML y dos archivos de
imágenes.
En todas esta sección, intenté señalar algunos de los aspectos en los cuales WSDL 2.0 diferirá
de WSDL 1.1, por ejemplo el cambio de portTypes (tipos de puerto) potencialmente múltiples a
una única interface (interfaz), y el hecho de que los message s (mensajes) ya no pueden tener
más de una parte. También se vislumbran otros cambios.
Varios factores motivan estos cambios, pero la mayoría de ellos se deben a motivos de
interoperabilidad --construcciones que no son lícitas en WS-I's Basic Profile y por lo general
están prohibidas-- o para facilitar el uso de WSDL con especificaciones SOAP ampliadas. Por
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 32/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
ejemplo, WSDL 2.0 usa más de un modelo de "componente", lo cual se adapta mejor a la
integración con las demandas de especificaciones tales como WS-Choreography.
1 ...
2 <wsdl:operation name="finalizeIssue"
3 pattern=http://www.w3.org/20
4 <wsdl:input message="tns:finalizeIss
5 </wsdl:operation>
6
7 <wsdl:operation name="createNewAd"
8 pattern="http://www.w3.org
9
10 <wsdl:input message="tns:createNewAd
11 <wsdl:output message="tns:createNewA
12 </wsdl:operation>
13 ...
Estilos WSDL
Una de las tareas más confusas para los desarrolladores que están aprendiendo a usar WSDL
es elegir un estilo para un documento. Analicemos las diferentes opciones y cómo afectan tanto
a WSDL, como al documento SOAP.
En el ámbito de XML, hay generalmente dos tipos de personas: aquellas que consideran a XML
como un formato de datos y aquellas que piensan en XML como marcado de documentos. En
general, estos dos extremos nunca se juntan. Esta separación se traslada, en cierta forma, a
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 33/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
los servicios web. Hay algunos que lo consideran una forma de Llamada a procedimiento
remoto (RPC) basada en XML y otros que lo consideran un medio de trasladar información
XML de un lugar a otro.
En términos de WSDL, esto se refleja en la elección del "estilo" del mensaje. Cuando cree el
enlace, podrá elegir el estilo del documento, como eligió Larry para el servicio de Avisos
Clasificados, o el estilo RPC. Ningún estilo es de por sí "correcto" o "incorrecto". Pero ambos
tienen ventajas y desventajas.
Cuando se use el estilo RPC, el nombre del método que se ejecutará es también el nombre del
elemento raíz de la carga útil. Pero usted dirá, un momento, ¿no es así como está estructurado
el WSDL de los Avisos Clasificados? Bueno, sí y no. Sí, el nombre del elemento raíz es el
mismo al nombre del método que queremos que aplique el servicio. Sin embargo, esto es, en
cierta forma, una coincidencia; Larry estructuró específicamente el servicio de esa manera.
Document/Literal
El estilo document/literal significa que la carga útil contiene sólo los datos reales que se
transmitirán al servicio. Cualquier ruteo necesario para que el mensaje llegue a su destino se
debe realizar de alguna otra forma, por ejemplo a través del encabezado soapAction o de una
URL específica para el servicio.
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 <env:Body>
6 <req:content>Vintage 1963 T-Bird...
7 <req:endDate>4/30/07</req:endDate>
8 </env:Body>
9
10 </env:Envelope>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 34/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Obsérvese que no hay elemento raíz para la carga útil. En el archivo WSDL, usted define los
elementos directamente y los agrega al mensaje (ver Listado 28).
1 <br>
2 ...
3 <wsdl:types>
4 <xs:schema xmlns:xs="http://www.w3.org
5 targetNamespace="http://org.apa
6 elementFormDefault="unqualified
7 attributeFormDefault="unqualifi
8
9 ...
10 <xs:element type="xs:string" name="c
11 <xs:element type="xs:string" name="e
12 ...
13 </xs:schema>
14
15 </wsdl:types>
16
17 <wsdl:message name="createNewAdRequestMe
18 <wsdl:part name="part1" element="ns1:c
19 <wsdl:part name="part2" element="ns1:e
20 </wsdl:message>
21
22 ...
23 <wsdl:portType name="ClassifiedServicePo
24
25 ...
26 <wsdl:operation name="createNewAd">
27 <wsdl:input message="tns:createNewAd
28 <wsdl:output message="tns:createNewA
29 </wsdl:operation>
30
31 ...
32 </wsdl:portType>
33 ...
34 <wsdl:binding name="ClassifiedServiceBin
35 type="tns:ClassifiedServicePortType">
36
37 <soap:binding transport="http://schema
38 style="document" />
39
40 <wsdl:operation name="createNewAd">
41 <soap:operation soapAction="createNe
42
43 <wsdl:input>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 35/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Obsérvese que en el estilo de documento, todos los elementos que forman parte de la carga útil
también tienen definiciones en el esquema. También, obsérvese que el mensaje tiene dos
partes distintas, cada una de las cuales se refiere a un elemento específico.
Document/Literal/wrapped
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 <env:Body>
6 <req:createNewAdRequest
7 xmlns:req="http://daily-mo
8 <req:content>Vintage 1963 T-Bird...
9 <req:endDate>4/30/07</req:endDate>
10
11 </req:createNewAdRequest>
12 </env:Body>
13 </env:Envelope>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 36/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Para completar el tema, aquí se incluye el respectivo WSDL (ver Listado 30).
1 ...
2 <wsdl:types>
3 <xs:schema xmlns:xs="http://www.w3.org
4 targetNamespace="http://org.apa
5 elementFormDefault="unqualified
6 attributeFormDefault="unqualifi
7 ...
8 <xs:element name="createNewAdRequest
9 <xs:complexType>
10 <xs:sequence>
11 <xs:element type="xs:string" n
12
13 <xs:element type="xs:string" n
14 </xs:sequence>
15 </xs:complexType>
16 </xs:element>
17 ...
18 </xs:schema>
19
20 </wsdl:types>
21
22 <wsdl:message name="createNewAdRequestMe
23 <wsdl:part name="part1" element="ns1:c
24 />
25 </wsdl:message>
26 ...
27 <wsdl:portType name="ClassifiedServicePo
28
29 <wsdl:operation name="createNewAd">
30
31 <wsdl:input message="tns:createNewAd
32 <wsdl:output message="tns:createNewA
33 </wsdl:operation>
34 ...
35 </wsdl:portType>
36 ...
37 <wsdl:binding name="ClassifiedServiceBin
38 type="tns:ClassifiedServicePortType">
39
40 <soap:binding transport="http://schema
41 style="document" />
42
43 <wsdl:operation name="createNewAd">
44 <soap:operation soapAction="createNe
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 37/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
45 />
46 <wsdl:input>
47 <soap:body use="literal"
48 namespace="http:
49
50 </wsdl:input>
51 <wsdl:output>
52 <soap:body use="literal"
53 namespace="http:
54 </wsdl:output>
55 </wsdl:operation>
56 ...
57 </wsdl:binding>
58
59 ...
RPC/Literal
El estilo RPC maneja las cosas de manera levemente diferente. Es el nombre propio de WSDL
que define qué se incluye en el mensaje, y no el esquema. Por ejemplo, analice este mensaje
SOAP (ver Listado 31).
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 <env:Body>
6
7 <req:createNewAdRequest
8 xmlns:req="http://daily-mo
9 <req:content>Vintage 1963 T-Bird...
10 <req:endDate>4/30/07</req:endDate>
11
12 </req:createNewAdRequest>
13 </env:Body>
14 </env:Envelope>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 38/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
1 ...
2 <wsdl:types>
3 <xs:schema xmlns:xs="http://www.w3.org
4 targetNamespace="http://org.apa
5 elementFormDefault="unqualified
6 attributeFormDefault="unqualifi
7 ...
8 </xs:schema>
9
10 </wsdl:types>
11
12 <wsdl:message name="createNewAdRequest">
13
14 <wsdl:part name="content" element="xsd
15 <wsdl:part name="endDate" element="xsd
16 </wsdl:message>
17
18 ...
19 <wsdl:portType name="ClassifiedServicePo
20
21 <wsdl:operation name="createNewAd">
22 <wsdl:input message="tns:createNewAd
23 <wsdl:output message="tns:createNewA
24 </wsdl:operation>
25
26 ...
27 </wsdl:portType>
28 ...
29 <wsdl:binding name="ClassifiedServiceBin
30 type="tns:ClassifiedServicePortType">
31
32 <soap:binding transport="http://schema
33 style="document" />
34
35 <wsdl:operation name="createNewAd">
36 <soap:operation soapAction="createNe
37
38 <wsdl:input>
39 <soap:body use="literal"
40 namespace="http:
41 </wsdl:input>
42 <wsdl:output>
43 <soap:body use="literal"
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 39/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
44 namespace="http:
45
46 </wsdl:output>
47 </wsdl:operation>
48 ...
49 </wsdl:binding>
50 ...
RPC/Encoded
1 <env:Envelope
2 xmlns:env="http://schemas.xmlSOAP
3 xmlns:xsd="http://www.w3.org/2001
4 xmlns:xsi="http://www.w3.org/2001
5 <env:Body>
6 <req:createNewAdRequest
7 xmlns:req="http://daily-mo
8 <req:content xsi:type="xs:string">V
9
10
11 <req:endDate
12 xsi:type="xs:string">4/30/07</req:endDa
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 40/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
13 </req:createNewAdRequest>
14 </env:Body>
15 </env:Envelope>
El WSDL para definir el mensaje es el mismo que RPC/literal, pero se agrega información de
codificación adicional al enlace (ver Listado 34).
1 <wsdl:definitions xmlns:xs="http://www.w
2 xmlns:soap="http://schemas.xmlsoa
3 xmlns:wsdl="http://schemas.xmlsoa
4 xmlns:tns="http://ws.apache.org/a
5
6 xmlns:axis2="http://ws.apache.org
7 xmlns:ns1="http://org.apache.axis
8
9 targetNamespace="http://ws.apache
10
11 <wsdl:types>
12 <xs:schema xmlns:xs="http://www.w3.org
13 targetNamespace="http://org.apa
14 elementFormDefault="unqualified
15 attributeFormDefault="unqualifi
16 ...
17 </xs:schema>
18
19 </wsdl:types>
20
21 <wsdl:message name="createNewAdRequest">
22 <wsdl:part name="content" element="xsd
23 <wsdl:part name="endDate" element="xsd
24 </wsdl:message>
25 ...
26
27 <wsdl:portType name="ClassifiedServicePo
28
29 <wsdl:operation name="createNewAd">
30 <wsdl:input message="tns:createNewAd
31 <wsdl:output message="tns:createNewA
32 </wsdl:operation>
33
34 ...
35 </wsdl:portType>
36
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 41/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
37 <wsdl:binding name="ClassifiedServiceBin
38 type="tns:ClassifiedServicePortType">
39
40 <soap:binding transport="http://schema
41 style="rpc" />
42
43 <wsdl:operation name="createNewAd">
44 <soap:operation soapAction="createNe
45
46 <wsdl:input>
47 <soap:body use="encoded"
48 encodingStyle=http://schemas.xmlsoap.org
49 namespace="http://ws.apache.org/axis2"
50 </wsdl:input>
51 <wsdl:output>
52
53 <soap:body use="literal" namespace
54 "http://ws.apache.org/axis2" />
55 </wsdl:output>
56 </wsdl:operation>
57
58 ...
59 </wsdl:binding>
60 ...
Cuando cree un archivo WSDL manualmente, deberá manejar todo esto usted mismo.
Afortunadamente, no siempre tiene que crearlo manualmente.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 42/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
En los comienzos de WSDL, las dos primeras aplicaciones que aparecieron fueron Java2WSDL
y WSDL2Java. Después de todo, de qué sirve un formato automatizado si no se puede usar
para automatizar algo. Por supuesto que en esos momentos las opciones eran bastante
limitadas. El código se orientaba al estilo RPC y era difícil generar automáticamente un sistema
con cargas útiles complejas.
Primero, Gene comienza con una clase Java y la usa para generar un documento WSDL.
Francis luego toma ese documento y lo usa para generar el servicio y el cliente. Para el
servicio, el proceso de generación crea un esqueleto en el cual usted puede agregar su propio
código para efectuar las acciones que desee que realice el servicio. Para el cliente, crea un
stub que usted puede usar para invocar un método de servicio web como si fuera un método
Java.
Preparación
El primer paso es asegurarse que su entorno esté listo. Descargue la versión 0.95 de Apache
Axis2, desempaquételo y verifique que todos los archivos *.jar en el directorio de la biblioteca
estén en CLASSPATH.
Para ejecutar el servicio web, instale Apache Geronimo (si aún no lo hizo) e inícielo. (Ver la
Parte 1 para conocer las instrucciones). Descargue la distribución de Axis2 v0.95 War y cópiela
al directorio <GERONIMO_HOME>/deploy. Geronimo implantará a Axis2 automáticamente.
Gene comienza con la clase ClassifiedService, la cual intenta usar como el servicio de
asistencia doméstica y también como una forma de probar que todo funcione como se espera
(ver Listado 35).
1 package org.dailymoon.classifieds;
2
3 public class ClassifiedService {
4
5 public static int createNewAd(String
6
7 ClassifiedAd newAd = new Classifie
8 newAd.setEnd(endDate);
9 newAd.setContent(content);
10 newAd.save();
11
12 return 1;
13
14 }
15
16 public static boolean editExistingAd(
17
18 //Do stuff with the ad here
19 return true;
20
21 }
22
23
24 public static ClassifiedList getExist
25
26 ClassifiedAd[] listOfAds = {new C
27 ClassifiedAd(), new ClassifiedAd()};
28 ClassifiedList listToReturn = new
29 return listToReturn;
30 }
31
32 public static void finalizeIssue(Stri
33 //Don't return anything.
34 System.out.println(dateToFinalize
35 }
36
37 public static void main (String args[
38
39 ClassifiedService.createNewAd(
40 "Eclipse experts needed. Con
41
42
43 ClassifiedAd adToEdit = new Cla
44 adToEdit.setId(1);
45 adToEdit.setStart("4/8/2006");
46 adToEdit.setEnd("4/30/2006");
47 adToEdit.setContent(
48 "Geronimo experts needed.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 44/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
49
50 ClassifiedService.editExistingA
51
52 ClassifiedList adList = Classif
53 System.out.println(adList.toStr
54
55 }
56
57
58 }
La case a su vez se refiere a otras dos clases, ClassifiedAd y ClassifiedList. Para que el
proceso de generación comprenda cómo estructurar estos objetos como XML, Gene los crea
como clases separadas (ver Listado 36).
1 package org.dailymoon.classifieds;
2
3 public class ClassifiedAd {
4
5 private int id;
6 private String startDate;
7 private String endDate;
8 private String content;
9
10 public void setId(int newId){
11 id = newId;
12 }
13
14 public void setStartDate(String newSt
15 startDate = newStart;
16 }
17
18 public void setEndDate(String newEnd)
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 45/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
19 endDate = newEnd;
20 }
21
22 public void setContent(String newCont
23 content = newContent;
24 }
25
26 public void save(){
27 //Save data here
28 System.out.println("Ad saved.");
29 }
30
31 }
1 package org.dailymoon.classifieds;
2
3 public class ClassifiedList {
4
5 public ClassifiedAd[] listOfAds;
6
7 public ClassifiedList(ClassifiedAd[]
8 listOfAds = newListOfAds;
9 }
10
11 public ClassifiedAd[] getRawAds(){
12 return listOfAds;
13 }
14
15 public String toString(){
16 return "This is a string of res
17 }
18
19 }
Aquí Gene especifica que ClassifiedList está compuesto por una variedad de
objetos ClassifiedAd.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 46/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
El switch -cn especifica la clase que forma la base para el servicio. El switch -o especifica el
directorio de los datos de salida. Suponiendo que no hubiera problemas, la clase se ejecuta
tranquilamente, dejando al archivo ClassifiedService.wsdl en el directorio de los datos de salida.
Este archivo es muy parecido al que generó Larry anteriormente —por diseño, ya que todos
funcionan en el mismo servicio— pero se debe realizar algunos pequeños cambios para
acomodar los elementos que fueron nombrados genéricamente por el proceso de generación.
Específicamente, los parámetros no se traducen bien y probablemente deban renombrarse.
Aquí está el archivo WSDL generado, con los ajustes en negrita (ver Listado 39).
1 <wsdl:definitions xmlns:xs="http://www.
2 xmlns:soap="http://schemas.xmlso
3 xmlns:wsdl="http://schemas.xmlso
4 xmlns:tns="http://ws.apache.org/
5 xmlns:ns1="http://org.apache.axi
6 targetNamespace="http://ws.apach
7
8 <wsdl:types>
9 <xs:schema xmlns:xs="http://www.w3.or
10 targetNamespace="http://org.ap
11 elementFormDefault="unqualifie
12 attributeFormDefault="unqualif
13
14 <xs:element type="ns1:ClassifiedAd"
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 47/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
15
16 <xs:complexType name="ClassifiedAd"
17 <xs:sequence>
18 <xs:element type="xs:int" name=
19 <xs:element type="xs:string" na
20 <xs:element type="xs:string" na
21 <xs:element type="xs:string" na
22
23 </xs:sequence>
24 </xs:complexType>
25
26 <xs:element type="ns1:ClassifiedLis
27 <xs:complexType name="ClassifiedLis
28 <xs:sequence>
29 <xs:element minOccurs="0" type=
30 name="Classifie
31 maxOccurs="unbounded" />
32
33 </xs:sequence>
34 </xs:complexType>
35
36 <xs:element name="createNewAdReques
37 <xs:complexType>
38 <xs:sequence>
39 <xs:element type="xs:string"
40
41 <xs:element type="xs:string"
42 </xs:sequence>
43 </xs:complexType>
44 </xs:element>
45
46 <xs:element name="createNewAdRespon
47
48 <xs:complexType>
49 <xs:sequence>
50 <xs:element type="xs:int" nam
51 </xs:sequence>
52 </xs:complexType>
53
54 </xs:element>
55
56 <xs:element name="editExistingAdReq
57 <xs:complexType>
58 <xs:sequence>
59 <xs:element type="ns1:Classif
60 name="existingAd" />
61
62 </xs:sequence>
63 </xs:complexType>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 48/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
64 </xs:element>
65
66 <xs:element name="editExistingAdRes
67 <xs:complexType>
68 <xs:sequence>
69
70 <xs:element type="xs:boolean"
71 wasSuccessful"/>
72 </xs:sequence>
73 </xs:complexType>
74 </xs:element>
75
76 <xs:element name="getExistingAdsReq
77
78 <xs:complexType />
79 </xs:element>
80
81 <xs:element name="getExistingAdsRes
82 <xs:complexType>
83 <xs:sequence>
84 <xs:element type="ns1:Classif
85 name="ClassifiedList" />
86
87 </xs:sequence>
88 </xs:complexType>
89 </xs:element>
90
91 <xs:element name="finalizeIssueRequ
92 <xs:complexType>
93 <xs:sequence>
94
95 <xs:element type="xs:string"
96 />
97 </xs:sequence>
98 </xs:complexType>
99 </xs:element>
100
101 </xs:schema>
102
103 </wsdl:types>
104
105 <wsdl:message name="createNewAdRequestM
106 <wsdl:part name="part1" element="ns1:
107 </wsdl:message>
108
109 <wsdl:message name="createNewAdResponse
110 <wsdl:part name="part1" element="ns1:
111
112 </wsdl:message>
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 49/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
113
114 <wsdl:message name="getExistingAdsRespo
115 <wsdl:part name="part1" element="ns1:
116 </wsdl:message>
117
118 <wsdl:message name="editExistingAdReque
119 <wsdl:part name="part1" element="ns1:
120 </wsdl:message>
121
122 <wsdl:message name="getExistingAdsReque
123 <wsdl:part name="part1" element="ns1:
124 </wsdl:message>
125
126 <wsdl:message name="editExistingAdRespo
127 <wsdl:part name="part1" element="ns1:
128 </wsdl:message>
129
130 <wsdl:message name="finalizeIssueReques
131 <wsdl:part name="part1" element="ns1:
132 </wsdl:message>
133
134 <wsdl:portType name="ClassifiedServiceP
135
136 <wsdl:operation name="finalizeIssue">
137 <wsdl:input message="tns:finalizeIs
138
139 </wsdl:operation>
140
141 <wsdl:operation name="createNewAd">
142 <wsdl:input message="tns:createNewA
143 <wsdl:output message="tns:createNew
144 </wsdl:operation>
145
146 <wsdl:operation name="editExistingAd"
147 <wsdl:input message="tns:editExisti
148 <wsdl:output message="tns:editExist
149 </wsdl:operation>
150
151 <wsdl:operation name="getExistingAds"
152 <wsdl:input message="tns:getExistin
153
154 <wsdl:output message="tns:getExisti
155 </wsdl:operation>
156
157 </wsdl:portType>
158
159 <wsdl:binding name="ClassifiedServiceBi
160 type="tns:ClassifiedServicePortType">
161
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 50/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
211 </wsdl:operation>
212
213 </wsdl:binding>
214
215 <wsdl:service name="ClassifiedService">
216 <wsdl:port name="ClassifiedServicePor
217
218 binding="tns:ClassifiedServiceBinding"
219
220 <soap:address location=
221 "http://127.0.0.1:8080/axis2/s
222 </wsdl:port>
223 </wsdl:service>
224
225 </wsdl:definitions>
Muchos de estos cambios se realizan por una cuestión de conveniencia y también de utilidad,
es mucho más fácil recordar "content" que "param0". Dos de estos cambios --el espacio de
nombres que aparece en la parte superior y el prefijo de espacio de nombres en la parte
inferior-- se deben a pequeños errores en el proceso de generación que existen en Axis2
versión 0.95 y tal vez al momento de leer esto ya no sean necesarios.
Una vez que ya existe el archivo WSDL, Francis puede usarlo para generar el servicio y el
cliente. (En realidad, Francis podría haber usado fácilmente la versión generada por Larry.)
Francis comienza por generar el código del lado del servidor, como se muestra en el Listado 40:
El primer parámetro es la URL para el archivo WSDL. Sí, usted puede acceder a un archivo
remoto usando esta aplicación. El segundo switch, -ss, le pide a la aplicación que genere el
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 52/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Esto implica literalmente cientos de archivos. Afortunadamente, usted sólo necesita manejarse
con uno de ellos.
Aunque en este caso el servicio fue generado por un archivo WSDL que a su vez fue generado
a partir de una clase Java, no hay una lógica real en el código generado, sólo aparece la
estructura. Para lograr que el servicio haga realmente algo, usted debe editar el archivo del
esqueleto.
1 service\src\org\dailymoon\classifieds\Cla
2 java
El código tiene un comentario extenso que puede ser útil cuando trata de descifrarlo para usted
mismo, pero puede distraer mucho al intentar explicarlo. Aquí se transcribe la versión limpia
junto con el código agregado para implementar parte del servicio (ver Listado 42).
1 package org.dailymoon.classifieds;
2
3 public class ClassifiedServicePortTypeSk
4
5 public axis2.apache.org.xsd.CreateNe
6
7 (axis2.apache.org.xsd.CreateNewAdR
8
9
10 //Todo fill this with the necessar
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 53/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
60 }
Obviamente, en un servicio real, usted querrá hacer algo más que simplemente texto de datos
de salida, pero Francis sólo está interesada en comprobar que esté funcionando. Para crear la
respuesta, comience con el documento de respuesta apropiado, adquiriendo una instancia a
través del parámetro Factory de la clase. (Las clases propiamente dichas son bastante
complejas, contienen una cantidad de clases internas, pero conviene ver cómo están
estructuradas). Una vez que tenga el documento, cree la respuesta real propiamente dicha y
agréguela a ese documento.
Para implantar el servicio necesitará compilarlo y convertirlo en un archivo Axis2. Comience por
compilar y empaquetar el servicio, como se muestra en el Listado 43.
1 set ANT_HOME=e:\apache-ant-1.6.5
2 PATH=%PATH%;%ANT_HOME%\bin;
3 set AXIS2_HOME=e:\axis2
4 cd service
5 ant jar.service
Ajuste adecuadamente su sintaxis para instalaciones que no sean con Windows y asegúrese
de usar sus ubicaciones de archivos reales.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 55/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Este trabajo de Ant compila todos los archivos apropiados y crea dos archivos,
ClassifiedService.aar y XBeans-packaged.jar, ambos en el directorio build/lib.
Para implantar el servicio, asegúrese que Geronimo esté ejecutándose y señale su navegador
como se muestra en el Listado 44:
Inicie sesión con las credenciales admin/axis2 y haga clic en Upload Service (Cargar
servicio)>Browse (Navegar). Navegue hasta el archivo ClassifiedService.aar y haga clic en
OK (Aceptar). Haga clic en Upload (Cargar) para completar el proceso.
Si hace clic en View Services (Ver servicios), debería ver el nuevo servicio en la lista.
Ahora sólo falta generar el cliente para acceder al nuevo servicio. Para hacer esto, ejecute el
siguiente comando desde la línea de comandos:
Como siempre, éste es un comando único, destinado a una sola línea. Los parámetros son
virtualmente idénticos a aquellos usados para la generación del lado del servidor, excepto que
usted no necesita un descriptor de servicio. Además, para mantener las cosas en orden,
Francis pone los archivos nuevos en un directorio, cliente, separado.
Esta clase debería ejecutarse tranquilamente, dejando cientos de archivos a su paso, pero
usted no necesita ocuparse de ninguno de ellos directamente.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 56/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
El proceso de generación de código en realidad no crea un cliente, sino una clase que usted
puede usar fácilmente para crear un cliente. Para simplificar la compilación, Francies crea un
archivo de clase nueva llamado Client.java en el directorio client\src\org\dailymoon\classifieds.
De esta manera, Ant tomará el archivo .java y lo compilará con el resto de la fuente.
1 package org.dailymoon.classifieds;
2
3 import axis2.apache.org.xsd.*;
4
5 public class Client{
6
7 public static void main(java.lang.Str
8
9 try{
10 ClassifiedServicePortTypeStub s
11 new ClassifiedServicePortT
12 "http://localhost:8080/axis2/servic
13
14 CreateNewAdRequestDocument cnaD
15 CreateNewAdRequestDocumen
16
17 CreateNewAdRequestDocument.Crea
18 cnaDoc.add
19 cnaReq.setContent("Vintage 1963
20 cnaReq.setEndDate("7/4/06");
21
22 CreateNewAdResponseDocument cna
23 s
24 System.out.println("New ad ID n
25 cnaResDoc.getCreateNewAd
26
27 } catch(Exception e){
28 e.printStackTrace();
29 }
30 }
31 }
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 57/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Para obtener la respuesta, use el stub para ejecutar el método createNewAd(), pasándolo al
documento de solicitudes como un parámetro. Una vez que tenga el documento de respuestas,
o mejor dicho el parámetro CreateNewAtResponseDocument, puede usarlo para extraer la
respuesta propiamente dicha y el atributo de esa respuesta.
Ahora ejecutémoslo.
Para ejecutar un cliente, Francis primero necesita compilarlo. Ejecute los siguientes pasos (ver
Listado 47).
1 >>set ANT_HOME=e:\apache-ant-1.6.5
2 >>PATH=%PATH%;%ANT_HOME%\bin;
3 >>set AXIS2_HOME=e:\axis2
4 >>cd client
5 >>ant jar.client
6 Buildfile: build.xml
7
8 init:
9
10 pre.compile.test:
11 [echo] Stax Availability= true
12 [echo] Axis2 Availability= true
13
14 compile.src:
15
16 compile.test:
17
18 jar.client:
19
20 BUILD SUCCESSFUL
21 Total time: 2 seconds
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 58/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Primero, asegúrese que el entorno tenga las variables apropiadas. (Esto supone que usted ya
agregó todos los archivos JAR de AXIS2_HOME\lib). Luego, cambie al directorio de cliente (o
cualquier directorio que use los datos de salida para el proceso de generación) y ejecute Ant
contra el jar.client de destino. Debería ver resultados similares a los que se muestran en cursiva
(ver Listado 47). Para ejecutar el cliente, primero corrija CLASSPATH para que incluya el
directorio de los recursos y el directorio que alberga todas las clases creadas por el proceso de
enlace de datos (ver Listado 48).
1 >>set CLASSPATH=E:\WSDLFiles\client\resou
2 ld\classes\axis2\apache\org\xsd\;%CLASSPA
3 >>cd build\classes
4 >>java org.dailymoon.classifieds.Client
Resumen
En la Parte 1 de esta serie, el Departamento de Avisos Clasificados del periódico Daily Moon
aprendió cómo usar los servicios web SOAP para conectarse con el Sistema de Gestión de
Contenidos del periódico. En este tutorial, el personal aprendió a usar Web Services
Description Language (WSDL) para describir sus propios servicios de manera tal que otros
pudieran usarlo. El tutorial cubrió los conceptos básicos del esquema XML, sumado a la
estructura de un archivo WSDL para que se lo pueda construir manualmente. También
describió las diferencias entre los distintos estilos y codificaciones disponibles. El tutorial
también explicó cómo usar las herramientas Java2WSDL y WSDL2Java que vienen con
Apache Axis2 para generar automáticamente WSDL a partir de archivos Java files y viceversa.
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 59/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
Temas relacionados
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 60/61
13/2/2019 Comprender los servicios web, Parte 2: Web Services Description Language (WSDL)
https://www.ibm.com/developerworks/ssa/webservices/tutorials/ws-understand-web-services2/index.html 61/61