Consumir servicio web SOAP (ShoppingAPI de eBay) desde un WSDL con JSP(X) en NetBeans
6.1.09. Por ooscarr (ooscarr)
Ahora haré lo mismo que hice por consola pero con una interfaz web. El consumo de un servicio web SOAP (el de ebay) a partir de un archivo WSDL
El código es casi el mismo, sólo cambia el envoltorio.
Necesitamos
En resumen,
- Registrarnos en el sitio de desarrolladores de ebay.
- Obtener una clave.
- Anotar la dirección del archivo WSDL.
Más detalle de esto en el artículo anterior.
Nuevo proyecto en Netbeans
Creamos un proyecto nuevo de tipo Aplicación Web

Le puse de nombre Tebay
.

El servidor, como siempre, Glassfish o Tomcat.


Terminar
Nuevo Cliente de Servicio Web
Después agregamos un Archivo nuevo
de tipo Web Service Client
Pegamos la dirección del WSDL http://developer.ebay.com/webservices/latest/ShoppingService.wsdl.

Terminar
.
Protocolo
ebay ofrece sus servicios web en diferentes formatos de pedido y respuesta como se muestra en la siguiente figura.

En esta ocasión no utilizaremos SOAP para hacer los pedidos, en vez de eso, haremos las requests por medio de URL (a lo REST), pero por lo menos lo que recibiremos será SOAP.
JavaBean
Creamos una nueva clase java.

La nombro, por ejemplo, BuscaItems y la agrego a un paquete, eeh.. consumidor.

BuscaItems.java
En el archivo .java escribo el código correspondiente a un bean, muy parecido al código de la clase java anterior
package consumidor;
import javax.xml.ws.BindingProvider;
public class BuscaItems {
public String que="No definido";
public String consulta="No definida";
public String estado="No procesado";
public Integer nitems=0;//Número de items
public String url="";
private static final String APPID = "UNAP3d995-2kj53-67u8-abcc-po988l9u035";
private static final String CALLNAME = "FindItems";
private static final String VERSION = "557";
private static final String BASEURL="http://open.api.ebay.com/shopping?";
private static BindingProvider bp;
//Constructor
public BuscaItems(){
}
public void setQue(String que){
String endpointURL = BASEURL+"callname=" + CALLNAME+"&version="+VERSION+"&appid=" + APPID;
try { // Llama Operación del Servicio Web
ebay.apis.eblbasecomponents.Shopping service = new ebay.
apis.eblbasecomponents.Shopping();
ebay.apis.eblbasecomponents.ShoppingInterface port = service.
getShopping();
bp = (BindingProvider) port;
bp.getRequestContext().
put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
endpointURL);
// Inicializa los argumentos de la operación del SW
ebay.apis.eblbasecomponents.
FindItemsRequestType findItemsRequest = new ebay.
apis.eblbasecomponents.FindItemsRequestType();
findItemsRequest.setQueryKeywords(que);
// Procesa los resultados
ebay.apis.eblbasecomponents.FindItemsResponseType result = port.findItems(findItemsRequest);
consulta=endpointURL;
estado=result.getAck().toString();
nitems=result.getTotalItems();
url=result.getItemSearchURL();
} catch (Exception ex) {
estado=ex.getMessage();
}
}
public String getConsulta(){
return consulta;
}
public String getEstado(){
return estado;
}
public Integer getNitems(){
return nitems;
}
public String getUrl(){
return url;
}
}
Nuevo JSPX
Biblioteca JSTL
Porque voy a usar <c:choose>, <c:when>, <c:otherwise>, <c:if> y <c:out>, y porque lo hice en Tomcat, es necesario agregar la biblioteca JSTL.
Para eso, en las propiedades del proyecto, en la sección Librerías
presionamos el botón Add Library...
(Añadir biblioteca...)

Y añadimos la biblioteca JSTL.

index.jspx
Para hacerlo más entretenido, la JSP la escribiré en el nuevo formato de etiquetas, así que crea un nuevo archivo JSP 2.0, e ingresa lo siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : index
Created on : 06-ene-2009, 23:47:10
Author : ooscarr
-->
<jsp:root
xmlns:jsp="http://java.sun.com/JSP/Page"
version="2.0"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<jsp:output
omit-xml-declaration="no"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-root-element="html"/>
<jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JSP Page</title>
</head>
<body>
<div class="encabezado">
<h1>¿Tebay?</h1>
<p>Nombra un producto y te diré si se encuentra en el sitio de ebay.</p>
</div>
<!-- Formulario de consulta -->
<h2>Consulta</h2>
<form action="index.jspx" method="get"><p>
<c:choose>
<c:when test="${empty param.que}">
<input type="text" name="que"/>
</c:when>
<c:otherwise>
<input type="text" name="que" value="${param.que}"/>
</c:otherwise>
</c:choose>
<button type="submit">Buscar</button>
</p></form>
<p>(Se obtienen mejores resultados con consultas en inglés).</p>
<!-- Si se consultó algo -->
<c:if test="${not empty param.que}">
<h2>Resultados de la búsqueda "<c:out value="${param.que}" />"</h2>
<jsp:useBean id="b" scope="page" class="consumidor.BuscaItems">
<jsp:setProperty name="b" property="que" value="${param.que}"/>
</jsp:useBean>
<c:set var="cuantos">
<jsp:getProperty name="b" property="nitems"/>
</c:set>
<c:choose>
<c:when test="${cuantos > 0}">
<!-- La intención de guardar esta variable es para
procesarla con c:out -->
<c:set var="url">
<jsp:getProperty name="b" property="url"/>
</c:set>
<p>Se encontraron
<jsp:element name="a">
<jsp:attribute name="href">
<!-- Al procesar con c:out los "&" se convierten en "%amp;" -->
<c:out value="${url}"/>
</jsp:attribute>
<jsp:body>
<jsp:getProperty name="b" property="nitems"/>
resultados en ebay
</jsp:body>
</jsp:element>
</p>
</c:when>
<c:otherwise>
<p><jsp:element name="a">
<jsp:attribute name="href">
<jsp:getProperty name="b" property="consulta"/>
</jsp:attribute>
<jsp:body>No hubieron resultados</jsp:body>
</jsp:element>.</p>
</c:otherwise>
</c:choose>
</c:if>
<hr /><p>Oscar Fernández</p>
</body>
</html>
</jsp:root>
Resultado
Al presionar el botón Ejecutar
(
), después de compilar y hacer Deploy automáticamente, se debería abrir la página http://localhost:8084/Tebay/index.jspx parecida a la siguiente:
* La página es sólo de referencia. No funciona.
Conclusiones
Este método claramente se demora debido a que debe comunicarse con los servidores de ebay antes de generar la página de resultado, por lo que el uso de estos servicios web en servidores externos son más recomendables procesarlos en el computador del cliente por medio de técnicas como, en el caso de la web, Javascript (bueno, AJAX).


0 comentarios (RSS
) :
Referencias a este artículo:
Página principal