Archive

Posts Tagged ‘Web Service’

Error “401 Unauthorized” al consumir un servicio web desde un DataControl en ADF 11g

enero 7, 2015 2 comentarios

Durante el desarrollo de una aplicación ADF me he encontrado con la necesidad de consumir un servicio web a través de un DataControl. El servicio tenía autenticación http básica, de modo que a mi DataControl le he añadido las credenciales. Una vez hecho esto, desplegué la aplicación en el Weblogic local y funcionó a la perfección.

Después, desplegué la aplicación en el servidor Weblogic del entorno de test y al ir a probar la página que hacía la llamada, me encontré con que se producía el error “javax.xml.soap.SOAPException: Bad response: 401 Unauthorized”.

Featured image

A continuación, os explico los pasos que hay que realizar para solucionar este problema.

En primer lugar es necesario que el DataControl sobrescriba las propiedades de seguridad que por defecto asigna Weblogic. Esto se realiza de la siguiente manera:

1. Seleccionar el archivo “DataControls.dcx”

Selecionar "DataControls.dcx"

2. En la ventana “Structure”, seleccionar el DataControl y mostrar el menú emergente. Seleccionar la opción “Define Web Service Security…”.

Definir seguridad

3. En la ventana emergente que se abre, debemos escoger la política de seguridad que hay que aplicar y a continuación sobrescribir sus propiedades. En el caso de usar autenticación HTTP básica hay que seleccionar la política “oracle/wss_http_token_client_policy”.

Seleccionar política de seguridad

 

Leer más…

Categorías:ADF / Java Etiquetas: , ,

ADF tips (MOBILE): Llamar a un servicio web

ADF tips (MOBILE)

Si su empresa ha apostado por SOA y necesita implementar una aplicación móvil, la forma natural de alimentar de datos esta aplicación será mediante servicios web.

ADF Mobile permite la integración con servicios web de forma fácil con el componente “Web Service Data Control”. Este tipo de “data control” permite acceder tanto a servicios SOAP como a servicios REST. A continuación vamos a mostrar un ejemplo de cómo incorporar una llamada a un servicio web en una aplicación ADF Mobile.

Para poder realizar esta demostración hemos creado un servicio web en una instalación local de Oracle Service Bus. El servicio consiste en una operación que devuelve una lista de frutas. En este post no entraremos en cómo implementar el servicio web. Por otro lado, vamos a suponer que ya disponemos de una aplicación móvil en desarrollo, a la que vamos a incorporar la llamada al servicio.

Paso 1: crear el “data control”
Seleccionamos el proyecto “ApplicationController” y a continuación llamamos a la galería para crear un nuevo objeto. En este caso, seleccionamos la opción “Data Control” dentro de la rama “Business Tier”. En las opciones que aparecen escogemos “Web Service Data Control (SOAP/REST)”. A continuación se inicia el asistente.

nuevo_dataControl

En el asistente se nos pide un nombre para el “data control”, que indiquemos el tipo (en nuestro caso, se trata de un servicio SOAP) y que especifiquemos la URL del descriptor del servicio (WSDL).

asistente1

Leer más…

Oracle Mobile Suite = Mobile + OSB + App. Adapters

Conjunt

El auge de las aplicaciones de movilidad ha llevado a buscar la mejor arquitectura y tecnología para facilitar y acelerar los desarrollos de este tipo de aplicaciones. La facilidad de consumir servicios web (SOAP o REST), desde dispositivos móviles, ha sido clave para establecer este mecanismo para la integración con los sistemas de BackEnd.

Si los servicios se publican en un Enterprise Service Bus, tendremos una arquitectura del estilo:

Arquitectura Oracle Mobile Suite

Arquitectura Oracle Mobile Suite

Dada esta situación, Oracle acaba de poner a la venta Oracle Mobile Suite. Esta suite se compone de los productos Mobile Development Framework, Enterprise Service Bus y Applications Adapters. La justificación para la creación de esta Suite está basada en la experiencia adquirida con los clientes que ya han implantado aplicaciones de movilidad, junto con la arquitectura, siempre recomendada por Oracle, de posicionar el Bus entre los dispositivos móviles y los sistemas de BackEnd.

Componentes de Oracle Mobile Suite

Componentes de Oracle Mobile Suite

Si unimos todas las piezas tenemos una solución completa de movilidad con un acceso fácil, rápido y seguro a la información de los sistemas de BackEnd de las compañías, desde los dispositivos móviles a través de Enterprise Service Bus con los Adaptadores.

Aquellas compañías que estén pensando incorporar aplicaciones de movilidad, tienen en esta Suite todo lo necesario para un desarrollo altamente productivo y desde el minuto cero. Por un lado, con Mobile Development Framework se pueden desarrollar aplicaciones de movilidad cross-device, que permitirán implementar y mantener una sola aplicación y desplegarla en distintos dispositivos (IOS, Android). Y por otro lado, además se beneficiarán de todas las ventajas de integración que aporta Enterprise Service Bus con Applications Adapters, no sólo con dispositivos móviles si no con múltiples aplicaciones heterogéneas.

Para más información:  http://www.oracle.com/us/technologies/mobile/oracle-mobile-suite-ds-2085011.pdf

Cabeceras personalizadas y procesos Oracle BPEL

En el momento de definir nuestros servicios web, nos podemos encontrar con la necesidad de incluir cabeceras personalizadas que aporten información añadida a las distintas operaciones del mismo.

Si estos servicios van a ser consumidos por una aplicación SCA, como puede ser un proceso BPEL, recomiendo seguir el siguiente consejo: incluir nuestra cabecera en la definición el mensaje.

Seguimos el orden de definición del WSDL para explicar nuestro caso. Si nos ceñimos a los elementos del contrato que nos conciernen, empezamos por la definición de mensajes.

Es común crear un mensaje que represente nuestra cabecera personalizada para reutilizarlo e implementar el siguiente formato:

<wsdl:message name="HeaderPersonalizado">
 <wsdl:part name="cabecera" element="client:miCabecera"/>
</wsdl:message> 
...
<wsdl:operation name="operacion1">
 <soap:operation style="document" soapAction="http://xmlns.Avanttic.com/Blog/HeaderPersonalizado/operacion1"/>
 <wsdl:input>
  <soap:body use="literal" parts="payload"/>
  <soap:header message="client:HeaderPersonalizado" part="cabecera" use="literal"/>
 </wsdl:input>
 <wsdl:output>
  <soap:body use="literal" parts="payload"/>
 </wsdl:output>
</wsdl:operation>

Aún siendo correcto, generar un contrato con este formato implica que el envío de la cabecera desde un proceso BPEL sea ligeramente más complejo. Veamos los pasos que realizaríamos para este caso:

  1. Generar una variable del tipo miCabecera:
    <variable name="miCabecera" element="client:miCabecera"/>
  2. Asignar los valores correspondientes a la cabecera mediante la actividad Assign.
  3. Asignar esta variable a la cabecera de la actividad Invoke.

En este punto nos encontramos con la particularidad de que la IDE de JDeveloper no permite realizar este paso y es necesario acceder al código fuente de la actividad y agregar la propiedad bpelx:inputHeaderVariable:

<invoke name="Ejecutar"
 partnerLink="ServicioWeb"
 portType="client:HeaderPersonalizado"
 operation="operacion1"
 inputVariable="Ejecutar_InputVariable"
 outputVariable="Ejecutar_OutputVariable"
 bpelx:invokeAsDetail="no"
 bpelx:inputHeaderVariable="miCabecera"/>

Veamos ahora otra forma de pasar nuestra cabecera siguiendo la recomendación inicial: incluir la cabecera en la definición del mensaje.
Leer más…

ADF tips: Integrando Web Services y Business Componets

noviembre 6, 2012 Deja un comentario

A veces nos encontramos con la necesidad de mostrar en la misma fila de una tabla campos procedentes de diferentes fuentes de datos (‘data sources’).  Puede darse el caso,  por ejemplo,  de que necesitemos cruzar mediante una operación ‘JOIN’ dos tablas que se encuentran en distintas Bases de Datos. También es posible que algunos atributos se encuentren en la B.D.  y el resto deban obtenerse mediante un Web Service. Este post  muestra los pasos a seguir para implementar una solución para este segundo escenario.

Vamos a describir de forma concisa el problema:

  1. Disponemos de una tabla en la B.D. donde se registran a modo de log todas las conexiones a nuestro sistema. Se guardan dos atributos, la fecha de conexión y la dirección IP de la máquina que se conectó.
  2. Tenemos que diseñar una pantalla que presente de forma tabular el log de conexiones con las siguientes columnas: fecha, IP y una tercera columna con el nombre del país al que pertenece la dirección IP.

Los dos primeros campos, los tenemos, pero la información correspondiente al tercero, ¿de dónde la obtenemos?  Muy sencillo: existen varios  Servicios Web  que nos proporcionan este dato,  uno de los más conocidos es GeoIP.  Trabajar con él será fácil: nosotros le damos una dirección IP  y el WS nos responde con el nombre del país.

¿Y cómo pegamos lo uno con lo otro, y en que lugar? El punto de encuentro está claro: en la capa del modelo, exactamente en el mismo ViewObject donde se realiza la consulta sobre la tabla de Log; añadimos un nuevo atributo llamado Country  y guardamos los cambios. Una vez hecho esto, editamos la clase que implementa el registro del ViewObject y sobrescribimos  el método getCountry() para que se comunique con el  Web Service, consiga el país y lo devuelva. No lo hará directamente, usaremos un JavaBean para ocultar y envolver las llamadas al servicio.

Hay que hacer notar, que estamos planteando un caso muy sencillo,  basta con utilizar un ViewObject de sólo lectura y no basado en entidad. Si los campos de la B.D. tuvieran que ser modificables, entonces diseñaríamos una vista basada en entidad y todo lo dicho para la columna externa (Country)  seguiría siendo válido. Otro caso de uso un poco mas complicado contemplaría la posibilidad de trabajar con WS que proporcionan operaciones  CRUD (create, read, update, delete). Entonces crearíamos entidades basadas en Web Services (y tendríamos que trabajar a nivel de entidad ocultando el origen de datos a los ViewObjects), pero eso lo dejamos para un futuro post.

Pongámonos manos a la obra:

1. Creamos un proyecto nuevo en nuestra aplicación y a partir del WSDL del servicio construimos un proxyService (de tipo JAX-WS,  con el ‘endpoint‘ de la versión 1.2)

Creación de un Web Service Proxy2. Creamos un JavaBean, para envolver la llamada al servicio. A partir de este Bean tendremos la posibilidad de crear un DataControl que nos permita trabajar de forma declarativa con los datos las estructuras del WS.  El método getGeoIP() se encarga de hacer la llamada a la operación del WS que nos interesa.

3. Diseñamos el  ViewObject  (LogView1) a partir de la tabla Log y le añadimos un atributo nuevo, Country.

4. Sobrescribimos  el método getCountry() en la implementación del registro de LogView1, para que obtenga a través d nuestro JavaBean el país correspondiente a la dirección IP.

5. Diseñamos la página con  la tabla de log, arrastrando y soltando el DataControl correspondiente a la vista LogView1 sobre la página, ejecutamos y vemos el resultado final.

Presentación homogénea de columnas que provienen de diferentes fuentes de datos

De esta forma en cinco sencillos pasos hemos conseguido resolver el problema. Seguramente no es muy eficiente llamar al servicio para cada fila, para mejorar esta situación usaremos nuestro JavaBean. Teniendo en cuenta que este tipo de servicios web ofrece operaciones que permiten pasar como parámetro listas de elementos en vez de elementos individuales y de igual manera devuelven listas de resultados, podremos invocar la operación del WS  una vez y mantener en un HashMap la lista de paises, evitando así una invocación  por cada registro.

Ejecutar un servicio securizado desde otro Proxy Service

Recientemente nos hemos encontrado con la necesidad de ejecutar, desde un Proxy Service, una operación en un servicio securizado con Oracle Web Service Manager (OWSM). Desde un Proxy Service, no podemos especificar las credenciales a utilizar en la invocación o enrutado a otro servicio proxy.

La solución planteada e implementada ha sido la de crear un Business Service con un Service Account asociado que haga de intermediario entre ambos servicios, consiguiendo así especificar las credenciales para el consumo de dicho servicio

Crear Service Account

Credenciales estáticasDado que se pretende ejecutar una operación en un servicio securizado, se ha de crear una Service Account (cuenta de servicio si tenemos el entorno traducido) con las credenciales necesarias, en nuestro caso y con la finalidad de simplificar el ejemplo, de tipo estático.

Generar Business Service

Creadas las credenciales, es cuestión de crear un servicio de negocio o Business Service para que haga de puente entre nuestros dos servicios proxy. En el apartado de Configuración de transporte HTTP seleccionamos el tipo de seguridad correspondiente y la cuenta de credenciales creada anteriormente:

Configuración del BS para adoptar las credenciales necesarias.

Configurar Proxy Service

Una vez podamos consumir las operaciones securizadas del servicio, se puede integrar en cualquier servicio proxy que tengamos creado agregando un routing,  publish o service callout a nuestro servicio proxy.

Selección del servicio "puente" con las credenciales asignadas.

De este modo, con tres sencillos pasos, conseguimos ejecutar servicios securizados desde otros proxy services.

soapUI: Probar Web Services de forma rápida y efectiva

noviembre 15, 2010 4 comentarios

Cuando nos dedicamos a realizar proyectos de integración de sistemas mediante Web Services, lo más probable es que nos pasemos una buena parte de nuestro tiempo probando el funcionamiento de los mismos, ya bien para testear el buen funcionamiento de los servicios que implementamos, o bien para hacer pruebas de los servicios que debemos consumir.

Por tanto, es importante disponer, en nuestro arsenal de herramientas, de una herramienta que nos permita realizar estas pruebas de una forma rápida. Hoy os sugiero utilizar la que estoy utilizando yo actualmente en distintos proyectos: soapUI.

soapUI es un producto de Eviware

En primer lugar, las ventajas que veo a soapUI son las siguientes:

1) Existe una versión libre que cubre las necesidades de test básicas.

2) Nos permite generar con facilidad el esqueleto de una petición. Sólo debemos rellenarla con los valores que queremos probar y listo.

Leer más…