Bienvenido/a, Invitado
Por favor Identificarse o Registrarse.    Contraseña olvidada?

Web Service mínimo para pruebas de Desarrollo
(1 viendo) (1) Invitado
Abajo
Publicar respuesta
Publicar nuevo tema
Página: 1
TEMA: Web Service mínimo para pruebas de Desarrollo
#658
Web Service mínimo para pruebas de Desarrollo hace 10 Meses  
Hola,

Tenemos que hacer pruebas en desarrollo y consumir un Servicio Web. El problema es que la dependencia con las áreas que lo proveen es demasiado grande y genera importantes retrasos. Para aliviar esto, buscamos crear de la forma más ágil posible nuestro propio Web Service sólo destinado a pruebas de desarrollo, es decir no necesita tener gran desempeño, y si tener una mínima configuración (cuanto más mínima mejor).
Por ahora pensamos dos enfoques:

1-Usar Jetty como servidor y hacer un mínimo tratamiento para reconocer las invocaciones(servicio/operaciones) y responder a ellas. Estos implica desarrollo de código, con las consecuentes idas y venidas de errores, pruebas y demás.

2-Usar SOAP UI, como "servidor", si se configura con un WSDL, genera automáticamente el formato de las repuestas a las operaciones y de forma sencilla se pueden editar para que funcione localmente.El problema es que lo necesitamos para que quede visible en la red (casi como un WS real!).

Vamos a intentar ir por ambas y decidir por la más ágil y versátil y les pasamos los avances que tengamos.
Si alguien se topó con el mismo dilema y quiere compartir anécdotas, fracasos y alegrías, es bienvenido.

Saludos
Introducir código aquí   
Por favor, aunque no se vea ningún BBcode ni botones de emoticonos, son usables igualmente
fer
fer
Fresh Boarder
Mensajes: 17
graphgraph
Usuario desconectado Presiona aquí para ver el perfil de este usuario
Reply Quote
 
#662
Re:Web Service mínimo para pruebas de Desarrollo hace 9 Meses, 4 Semanas  
Intentamos con jetty y tuvimos la siguiente experiencia:

Idealmente para exponer un Web service se necesita:

0-Parsear el WSDL y obtener información de Ws y operaciones. (Opcional)

Dentro del método handle del servlet que provee Jetty:
1-Leer del request el stream de entrada (no es trivial) y obtener mensaje xml.
2-Parsear el xml (una posibilidad es XStream) para obtener la operación requerida.
3-Según la operación elegir la respuesta.
4-Codificar la respuesta en xml y enviar en el response del servlet de Jetty.
5-Exponer el WSDL (Opcional)

Por lo visto el trabajo de codificación es arduo, nosotros llegamos a una versión muy simple
para implementar una sola operación de un WS (sólo pasos 1-3-4) y dejamos ahí. Vimos que funciona y cuando uno resuelve los puntos anteriores prácticamente puede hacer cualquier cosa. Y queda un servidor ligero.


Código:


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Request;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.AbstractHandler;

public class ServidorMock {

    public static void main(String[] args) throws Exception {

        int puerto = 10000;

        Server server = new Server(puerto);

        Handler handler = new AbstractHandler() {

            public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)

            throws IOException, ServletException {

                response.setStatus(HttpServletResponse.SC_OK);
                StringBuffer stringBuffer = new StringBuffer();
                BufferedReader bufferedReader = null;

                try {

                    InputStream inputStream = request.getInputStream();
                    if (inputStream == null) {
                        stringBuffer.append("");
                    } else {
                        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                        char[] charBuffer = new char[128];
                        int bytesRead = -1;
                        bytesRead = bufferedReader.read(charBuffer);
                        while (bytesRead > 0) {
                            stringBuffer.append(charBuffer, 0, bytesRead);
                            bytesRead = bufferedReader.read(charBuffer);
                        }
                    }

                } catch (IOException ex) {
                    throw ex;
                } finally {
                    if (bufferedReader != null) {
                        bufferedReader.close();
                    }
                }

                // Obtengo el mensaje recibido en xml (invocación al WS)
                String body = stringBuffer.toString();

                response.setContentType("text/xml");

                // La respuesta es fea y rápida
                if (body.indexOf("operacion1") > 0) {
                    System.out.println("Se llamó a Operacion1");
                    String respuestaOp1 = "<?xml version='1.0' encoding='iso-8859-1'?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"xmlns:urn=\"urn:xmethods-mi-webservice\"><soapenv:Header/><soapenv:Body><urn: resultado><saldo>1000</saldo><status>0</status><!--Optional:--><descrip>Obtengo un saldo en operacion 1</descrip></urn:resultado></soapenv:Body></soapenv:Envelope>";
                    response.getWriter().print(respuestaOp1);

                }

                response.getWriter().close();
                ((Request) request).setHandled(true);
            }

        };

        server.setHandler(handler);
        server.start();
        System.out.println("Servidor iniciado");
    }

}

Introducir código aquí   
Por favor, aunque no se vea ningún BBcode ni botones de emoticonos, son usables igualmente
fer
fer
Fresh Boarder
Mensajes: 17
graphgraph
Usuario desconectado Presiona aquí para ver el perfil de este usuario
Última edición: 05/10/2009 20:50 por fer.
Reply Quote
 
#664
Re:Web Service mínimo para pruebas de Desarrollo hace 9 Meses, 4 Semanas  
El intento final fue con SOAP UI, por lejos es lo que realmente necesitabamos. Partiendo del WSDL y alimentándolo con él, crea automáticamente un servicio web con una demo de invocación y respuesta para cada operación declarada.

Pasos:
1-Generar nuevo proyecto, con el WSDL inicial y activar "create requests" y "create Ws Simulation of the imported WSDL"
2-Cuando presenta la pantalla para Generar el mock Service, colocar el path y puerto
y seleccionar "Adds the Mock Services endpoint to the mocked interface" si se quiere usar luego una dirección diferente a la indicada en el WSDL.
3-Dar el nombre al Mock service
4-Verificar cada respuesta para las operaciones generadas y editarlas con el contenido que se necesite par el servicio.
5-Iniciar el Mock service que quedará atendiendo en el puerto y path indicados.
6-Guardar el proyecto, esto genera un xml con la información necesaria para volver a generar el proyecto.

Un detalle importante es que si usamos SOAP UI 2.5 cuando invoquemos desde el exterior al WSDL publicado por nuestro Mock este queda conformado una dirección de localhost en <SOAP:address location="localhost:port/path"/> y si quiero usarlo para invocar el servicio (por ejemplo con alguna herramienta automatizada) me invocará al WS en el localhost y no la dirección del servidor.

Con la versión 3.0 esto no sucede, y es la que usamos. Necesita Java 6

Si se quiere iniciar el servidor desde una línea de comando se necesita el xml generado al guardar el proyecto(ej: Mi-soapui-project.xml).
Para Win se hace un .bat de esta manera(hay uno similar incluido en la distribución de SOAP UI):

mockservicerunner.bat:

Código:


@echo off

set SOAPUI_HOME=%~dp0

set JAVA_HOME=C:\Archivos de programa\Java\jre6
set JAVA=%JAVA_HOME%\bin\java

set CLASSPATH=%SOAPUI_HOME%soapui-3.0.1.jar;%SOAPUI_HOME%..\lib\*;

rem JVM parameters, modify as appropriate
set JAVA_OPTS=-Xms128m -Xmx384m -Dsoapui.properties=soapui.properties "-Dsoapui.home=%SOAPUI_HOME%\"

if "%SOAPUI_HOME%\" == "" goto START
    set JAVA_OPTS=%JAVA_OPTS% -Dsoapui.ext.libraries="%SOAPUI_HOME%ext"
    set JAVA_OPTS=%JAVA_OPTS% -Dsoapui.ext.listeners="%SOAPUI_HOME%listeners"
    set JAVA_OPTS=%JAVA_OPTS% -Dsoapui.ext.actions="%SOAPUI_HOME%actions"
:START
rem ********* run soapui testcase runner ***********

"%JAVA%" %JAVA_OPTS% -cp "%CLASSPATH%" com.eviware.soapui.tools.SoapUIMockServiceRunner %*



Y se ejecuta:
mockservicerunner.bat -m"Nombre-MockService" "Mi-soapui-project.xml"
Introducir código aquí   
Por favor, aunque no se vea ningún BBcode ni botones de emoticonos, son usables igualmente
fer
fer
Fresh Boarder
Mensajes: 17
graphgraph
Usuario desconectado Presiona aquí para ver el perfil de este usuario
Última edición: 06/10/2009 20:56 por fer.
Reply Quote
 
Arriba
Publicar respuesta
Publicar nuevo tema
Página: 1
Moderadores: diego, leito