martes, 28 de octubre de 2008

Taller de Extensions en la reunión del GUG de noviembre

El próximo sábado, 1º de noviembre, es la reunión del Grupo de Usuarios GeneXus de Montevideo. En esta oportunidad voy a estar dando un taller sobre el desarrollo de Etensions para GeneXus X.

La idea es mostrar algunas cosas que se pueden hacer con una Extension, y lo que es más importante, mostrar como se hacen y que todos puedan hacerlo en la práctica.

El temario es más o menos el que aparece en la nota en el blog del GUG, puede ser que tenga algún cambio pero va a ser menor. Si alguien tiene algún tema que le interese, me deja un comentario y si tengo tiempo lo agrego...

Los requisitos para poder hacer el taller son:
  • llevar un PC o notebook (recomendado...), porque no hay máquinas disponibles.
  • tener instalado Visual Studio 2005 o superior, se puede usar la versión Express de Visual C# 2008.
  • tener instalado GeneXus X U2, puede ser la versión trial (hay que pedir las licencias que creo que las dan por 60 días)
  • tener insltado el GeneXus X SDK U2
  • tener conocimientos básicos de C#...
Quienes se quieran anotar, ponganse en contacto con la gente del GUG, porque no se como es el tema de los cupos.

lunes, 27 de octubre de 2008

Actualizaciones automáticas

Recién estaba trabajando tranquilamente, cuando me apareció este cartel:


Lo bueno es que me deja elegir si quiero reiniciar ahora...

Tengo configurado para que se descarguen las actualizaciones pero que no se instalen automáticamente. ¿Por qué instaló esta? ¿Por qué necesita reiniciar el equipo de forma tan urgente? ¿Qué fue lo que instaló?

Por suerte también se reiniciaron los servidores...

Lástima que GeneXus no funciona en Linux.

miércoles, 22 de octubre de 2008

miércoles, 15 de octubre de 2008

Crisis financiera…

Con todo lo que se ha hablado en estos últimos días de la crisis financiera y la especulación, me hizo acordar a un cuento de Eduardo Galeano, que leí hace no mucho.

Fundación de las agencias de noticias

  Napoleón fue definitivamente aniquilado por los ingleses en la batalla de Waterloo, al sur de Bruselas.

  El mariscal Arthur Wellesley, duque de Wellington, se adjudicó la victoria, pero el vencedor fue el banquero Nathan Rothschild, que no disparó ni un tiro y estaba muy lejos de allí.

  Rothschild operó al mando de una minúscula tropa de palomas mensajeras. Las palomas, veloces y bien amaestradas, le llevaron la noticia a Londres. Él supo antes que nadie que Napoleón había sido derrotado, pero hizo correr la voz de que la victoria francesa había sido fulminante, y despistó al mercado desprendiéndose de todo lo que fuera británico, bonos, acciones, dinero. Y en un santiamén todos lo imitaron, porque él siempre sabía lo que hacía, y a precio de basura vendieron los valores de la nación que creían vencida. Y entonces Rothschild compró. Compró todo, a cambio de nada.

  Así Inglaterra triunfó en el campo de batalla y fue derrotada en la Bolsa de Valores.

  El banquero Rothschild multiplicó por veinte su fortuna y se convirtió en el hombre más rico del mundo.

  Algunos años después, a mediados del siglo diecinueve, nacieron las primeras agencias internacionales de prensa: Havas, que ahora se llama France Presse, Reuters, Associated Press…

  Todas usaban palomas mensajeras.

del libro Espejos. Una historia casi universal.

viernes, 3 de octubre de 2008

Consumir web service con SSL y autenticación

Después de dos días de luchar con este tema, por fin logré que funcione. Podríamos decir que este es un post de descarga...

Escenario

En una aplicación generada con GeneXus 9.0, generador Java web, tenía que consumir un web service HTTP (no es SOAP), que se invoca a través de HTTPS y que además pide usuario y contraseña... El servicio está en un IIS, en .Net. Casi que trivial.

Problema 1: SSL

Con el primer problema que me encontré, obviamente, fue como acceder a una página web que está encriptada.

El primer intento fue con
&httpClient.Host = &host
&httpClient.Port = 443
&httpClient.Secure = 1
que por supuesto no funciona... El problema es que para usar SSL hay que encriptar los datos, para lo cual se necesita un certificado.

Por suerte encontré este documento en el Wiki que explica bien lo que hay que hacer.

Problema 2: Autenticación

Una vez resuelto el problema con el SSL, al consumir el servicio daba un error 401, not authorized.

La forma de configurar la autenticación en GeneXus es con 
&httpClient.AddAuthentication(&httpClient.Basic, &realm, &user, &pass)
El usuario y la contraseña que le estaba pasando estaban bien, eran lo que usaba al probar el servicio desde el navegador y ahí funcionaba.

Como no tengo acceso al servidor donde está corriendo el web service, y así se complicaba para hacer las pruebas, me configuré (en realidad le pedí a Alexander que lo haga...) el servidor local para que acepte conexiones HTTPS.

Después de un rato de probar con distintas configuraciones en el servidor local encontré el problema: el Realm que se le pasa al método AddAuthentication es importante...

Conseguí el Realm del servidor donde está el servicio, y logré que me devolviera un HTTP status 200, es decir OK.

Problema 3: Se conecta pero no trae datos

Si bien ahora pasaba por el SSL y la autenticación, y devolvía un OK, el resultado de
&httpClient.ToString()
era vacío. En el navegador me mostraba datos, pero al consumir el servicio desde GeneXus venía vacío.

Para ver que estaba haciendo el navegador, me instalé un add-on de Firefox, Live HTTP Headers, que permite ver que es lo que se le manda al servidor y la respuesta. No podía compararlo con lo que le manda GeneXus, porque como la conexión está encriptada, no tenía una forma fácil de hacerlo.

Así que le agregué todos los headers HTTP al procedimiento GeneXus con el método
&httpClient.AddHeader()
y ahí por fin funcionó todo espectacular.

Conclusiones

Así que, después de luchar bastante rato con esto, llegué a una solución que funciona...

El código completo es:
&httpClient.Host = &host
&httpClient.Port = 443
&httpClient.BaseUrl = ''
&httpClient.AddHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
&httpClient.AddHeader('Accept-Language', 'en-us,en;q=0.5')
&httpClient.AddHeader('Accept-Encoding', 'gzip,deflate')
&httpClient.Secure = 1

&httpClient.AddAuthentication(&httpClient.Basic, &realm, &user, &pass)

&httpClient.Execute('GET', &url)
Fundamental para consumir un servicio que esté con SSL y autenticación:
  1. no olvidarse de importar el certificado del servidor, para que pueda encriptar los datos que manda
  2. averiguar cual es el Realm que hay que usar, y el método de autenticación (basic o digest)
  3. si no funciona, agregarle los HTTP headers que sean necesarios