Crear Un Webservice Básico Con PHP y Java
Crear Un Webservice Básico Con PHP y Java
SOAP es un protocolo de intercambio para servicios web basado en XML, sobre el que puedes leer en esta entrada de la wikipedia. Para no liarnos con prembulos, vamos con la chicha cmo creamos un servicio web en PHP?. Para facilitarnos la vida empezaremos por descargar NuSOAP, un toolkit para el desarrollo de servicios web con SOAP en PHP, que nos proveer de diversas clases para trabajar con este protocolo. Basta con descargarlo, descomprimirlo, meterlo dentro de nuestro proyecto y, cuando queramos usarlo, incluir nusoap.php como librera. Ok, con NuSOAP instalado toca crear un servidor SOAP en nuestra aplicacin. Para el ejemplo crearemos un servidor, lo llamaremos producto.php, que si recibe una peticin donde se le pida una lista de libros devuelva tres ttulos (es un ejemplo bsico, piensa que en la realiad podras acceder a una base de datos y dar muchas ms funcionalidades). 1 2 <?php 3 require_once "nusoap.php"; 4 function getProd($categoria) { 5 if ($categoria == "libros") { 6 return join(",", array( 7 "El seor de los anillos", 8 "Los lmites de la Fundacin", 9 "The Rails Way")); } 10 else { 11 return "No hay productos de esta categoria"; 12 } 13 } 14 15 $server = new soap_server(); $server->register("getProd"); 16 $server->service($HTTP_RAW_POST_DATA); 17 ?> 18 19 Ok, ahora necesitas un cliente, que llamaremos cliente.php. En el constructor, el cliente recibir el url del servidor y para acceder al mtodo que nos devuelve los libros recurriremos al mtodo call(), al cual le pasaremos el nombre del mtodo del servidor al que queremos acceder y los parmetros en forma de array. Adems, tambin controlaremos que no haya errores en la comunicacin. <?php 1 require_once "nusoap.php"; 2 $cliente = new nusoap_client("http://localhost/producto.php"); 3 4 $error = $cliente->getError(); 5 if ($error) { echo "<h2>Constructor error</h2><pre>" . $error . "</pre>"; 6 } 7 8 $result = $cliente->call("getProd", array("categoria" => "libros")); 9 10 if ($cliente->fault) { 11 echo "<h2>Fault</h2><pre>";
print_r($result); 12 echo "</pre>"; 13 } 14 else { 15 $error = $cliente->getError(); if ($error) { 16 echo "<h2>Error</h2><pre>" . $error . "</pre>"; 17 } 18 else { 19 echo "<h2>Libros</h2><pre>"; 20 echo $result; echo "</pre>"; 21 } 22 } 23 ?> 24 25 26 27 28 Con esto ya tienes una idea my bsica del funcionamiento de un webservice SOAP construdo con PHP. Pero claro, nos falta un archivo WSDL para tener un webservice decente. Aunque dicho archivo puede ser escrito a mano, NuSOAP puede generarlo por tipasndole ciertos parmetros, por lo que lo ideal sera generarlo en el servidor. As que modifica tu producto.php para que quede tal que as: 1 2 <?php require_once "nusoap.php"; 3 4 function getProd($categoria) { 5 if ($categoria == "libros") { 6 return join(",", array( 7 "El seor de los anillos", "Los lmites de la Fundacin", 8 "The Rails Way")); 9 } 10 else { 11 return "No hay productos de esta categoria"; 12 } } 13 14 $server = new soap_server(); 15 $server->configureWSDL("producto", "urn:producto"); 16 17 $server->register("getProd", 18 array("categoria" => "xsd:string"), 19 array("return" => "xsd:string"), "urn:producto", 20 "urn:producto#getProd", 21 "rpc", 22 "encoded", 23 "Nos da una lista de productos de cada categora"); 24 25 $server->service($HTTP_RAW_POST_DATA); ?> 26 27
28 29 Como ves, el cambio en es cuando llamamos a register, ya que en vez de pasarle, como antes, el mtodo en cuestin, le aadimos tambin varios argumentos para generar el WSDL:
El primer array nos permite definir el argumento de entrada y su tipo de datos El segundo define la funcin de retorno y su tipo de datos urn:producto es la definicin del namespace urn:producto#getProd es donde definimos la accin SOAP Luego viene el tipo de llamada,que puede ser rpc, como en el ejemplo, o document Tras esto definimos el valor del atribute use, que puede ser encoded o literal Finalmente viene una descripcin de qu hace el mtodo al que llamamos Ahora basta con que en el navegador accedas a producto.php?wsdl y vers el WSDL generado. Ya puedes copiarlo y aadirlo a tu directorio web (crea un archivo y llmalo, por ejemplo, libros.wsdl). Para que el cliente lo utilice debes modificar el cdigo, y en el constructor, en vez del url le pasas el nombre del archivo, de forma que quede como en el ejemplo: $client = new nusoap_client("libros.wsdl", true); 1 Ahora s, ya tienes montado un pequeo servicio web. El ejemplo es simpln, pero piensa en todas las funcionalidades que podras incorporarle.
Hola a todos, bienvenidos a otro curso de desarrollo web, esta vez vamos a aprender cmo crear servicios web en java con el IDE NetbBeans. Antes de implementarlo, quiero recordarles que usamos servicios web en sistemas distribuidos donde necesitamos integrar diferentes plataformas como .NET, JAVA etc.
Abrimos nuestro NetBeans, en mi caso uso una versin 6.9.1 full que me funciona muy bien sobre windows 7 Ultimate x64
A continuacin le damos un nombre a nuestro proyecto, y los dems valores los dejamos por defecto
En la siguiente pantalla debemos escoger el servidor, en nuestro caso usaremos GlassFish Server 3 y la versin de java EE la dejamos como JAVA EE 6 Web
la ventana a continuacin la dejamos como est. No seleccionamos ningn valor de los checkbox
Luego de configurar, veremos un entorno como el siguiente, que es cdigo puro de HTML, y el conocidsimo Hello World!
Damos clic en ejecutar, para levantar los servicios seamos un poco pacientes, lleva de 2 a 3 minutos al finalizar veremos en nuestro explorador el Hello World!
De seguido necesitamos crear un nuevo paquete en donde se alojar el servicio web que vamos a construir damos clic derecho en fuente de paquetes, luego clic en nuevo y seleccionamos paquete de java
Obviamente le tenemos que dar un nombre, siempre usen pack_ + el nombre que le deseen asignar para llevar una jerarqua en cuanto nombres en el desarrollo de aplicaciones
ahora ubicamos a nuestro paquete, y le damos clic derecho seleccionamos nuevo y escogemos servicio web
le asignamos ahora un nombre a nuestro servicio web, que servir para identificarlo dentro de netbeans
Concluido el proceso, seleccionamos modo diseador, clic en agregar operacin, le asignamos un nombre que en nuestro caso lo denomin multiplicar_dos_nmeros con clic en agregar, inserto 3 parmetros dos de tipo int y uno de tipo string que me servir para mostrar el resultado cambio de nombres a cada una de las variables, segn nuestra necesidad
Volvemos a modo cdigo y agregamos las sentencias que busquemos sean ejecutadas por el servicio web en mi caso estoy declarando una nueva variable para multiplicar do nmeros que ingrese el usuario y devuelvo un texto concatenado con el resultado
para probar nuestro servicio web, buscamos la carpeta servicios web en el rbol de contenidos de la izquierda ingresamos en l y ubicamos a nuestro servicio web que creamos le damos clic derecho y probar servicio web
En el navegador veremos algo como esto, en donde debemos ingresar las variables que definimos en el servicio web solo necesitamos ingresar dos valores porque la tercera variable la usamos como retorno de la operacin as que le damos los valores del nmero 1 y del nmero 2 para multiplicarlos y clic en el botn que indica la operacin a realizar
lo que devolver ser el valor de las variables que ingresamos y su multiplicacin o resultado que se proces dentro del servicio web
de esta manera se manejan los servicios web, en prximas publicaciones les ensear como invocar este mismo servicio web desde .NET
Para descargarnos NetBeans iremos a https://netbeans.org/downloads/. De todas las opciones que nos indica, os recomiendo descargar el paquete Java EE o All para asegurarnos de tener instalado GlassFish. En mi caso he escogido el paquete All para curarme en salud ;-).
De la instalacin voy a comentar poco, ya que simplemente hay que seguir el asistente con la tcnica de siguiente siguiente siguiente, estando bien seguros que instalamos GlassFish.
En el asistente se nos preguntar por el servidor que usaremos, y es aqu donde seleccionaremos el GlassFish que hemos instalado.
Una vez creado el proyecto, aadiremos un nuevo WebService desde el men contextual New > WebService.
Y con esto ya tenemos el servicio creado. @WebService(serviceName = "WSDemo") public class WSDemo {
/** * This is a sample web service operation */ @WebMethod(operationName = "hello") public String hello(@WebParam(name = "name") String txt) { return "Hello " + txt + " !"; } }
Analizando su cdigo, vemos que el servicio publica una funcin llamada hello. Sabemos que la clase es un servicio por @WebService y que es una funcin publicada en el WS por@WebMethod. Si queremos aadir una nueva funcin, simplemente tendremos que copiar la anterior y cambiar lo que queramos ;-)
Para publicar el servicio simplemente seleccionaremos deploy en el men contextual sobre el proyecto.
En el output del IDE nos mostrar que se ha generado correctamente y que GlassFish est iniciado.
Este nos generar la invocacin, y simplemente pulsado el botn de run, obtendremos el resultado en el lateral derecho de la request.
Simple, verdad?
A travs de un video tutorial (mencionado al final de este documento), aprend a crear un simple servicio web con NetBeans. Segn le, Sun removi el soporte para el WSDK (aunque igual se sigue distribuyendo) para reemplazarlo por GlassFish. As que ni modo. Pero estas instrucciones tambin funcionan con Tomcat.
4. Y Terminar
Cdigo?
Como toda apliacin web, me aparece el tpico index.jsppredeterminado en el que puedo aprovechar de describir el Servicio Web (puedo poner cualquier cosa, en realidad, porque esto no es parte del servicio web).
index.jsp
<%-Document : index Created on : 21-dic-2008, 12:06:37 Author : ooscarr --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es-cl"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Servicio web</title> </head> <body> <h1>Este es el Servicio web</h1> <p>Este servicio lo que hace es decir "Hola, [nombre]" a cambio de un parmetro [nombre] de tipo <code>String</code>.</p> </body> </html>
Aadir operaciones
Para aadir operaciones hay que slo posicionarse sobre el Servicio Web y poner Add Operation...
en
el
el
botn Add
Ah le pongo un nombre, puedo aadir parmetros y elegir si lo quiero de tipo String, boolean, int, etc.
ServicioWeb.java
Con eso se generar automticamente el cdigo esqueleto que puedo modificar para que me retorne "Hola, " + nombre;. As:
package hola; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; /** * * @author ooscarr */ @WebService() public class ServicioWeb { /** * Web service operation */ @WebMethod(operationName = "diHola") public String diHola(@WebParam(name = "nombre") String nombre) {
//TODO write your implementation code here: return "Hola, " + nombre; } }
Probmoslo
Ya. Probmoslo. Para eso primero hay que armar el proyecto con el men contextual del proyecto, opcin Deploy.
GENERACIN CORRECTA (tiempo total: 7 segundos)
Y probar el servicio web, seleccionando el Servicio web, opcin Test Web Service.
INFO: Dynamically creating request wrapper Class hola.jaxws.DiHola INFO: Dynamically creating response wrapper bean Class hola.jaxws.DiHolaResponse INFO: parsing WSDL... INFO: generating code... INFO: compiling code... INFO: Invoking wsimport with http://localhost:8080/Holaste/ServicioWebService?WSDL INFO: wsimport successful INFO: parsing WSDL... INFO: generating code... INFO: compiling code... INFO: Invoking wsimport with http://localhost:8080/Holaste/ServicioWebService?WSDL INFO: wsimport successful
Si todo est bien instalado, se debera abrir una ventana del navegador ms o menos as.
Aqu, por ejemplo, si pongo Oscar en el formulario, se puede ver el cdigo que entrega el servicio Web al cliente.
WSDL
Tambin es bueno hacer notar que NetBeans genera automticamente el archivo WSDL (y su XML Schema tambin) para ser usado en las implementaciones de los Clientes.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.5-hudson-$BUILD_NUMBER-. --> <definitions targetNamespace="http://hola/" name="ServicioWebService" xmlns:tns="http://hola/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xsd:schema> <xsd:import namespace="http://hola/" schemaLocation="ServicioWebService_schema1.xsd"/> </xsd:schema> </types> <message name="diHola"> <part name="parameters" element="tns:diHola"/> </message> <message name="diHolaResponse"> <part name="parameters" element="tns:diHolaResponse"/> </message> <portType name="ServicioWeb"> <operation name="diHola"> <input message="tns:diHola"/> <output message="tns:diHolaResponse"/>
</operation> </portType> <binding name="ServicioWebPortBinding" type="tns:ServicioWeb"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="diHola"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="ServicioWebService"> <port name="ServicioWebPort" binding="tns:ServicioWebPortBinding"> <soap:address location="REPLACE_WITH_ACTUAL_URL"/> </port> </service> </definitions>
Fuente
Todo lo que dije lo saqu de un video hecho por un desarrollador de Sun. Lo puedes ver (en ingls) desde el siguiente link, por si te qued alguna duda.