Ver las tablas creadas con Azure Mobile Services desde un cliente REST

Bueno, el titulo ya dice todo, vamos a ver el tema de como manipular los datos de las tablas desde un cliente REST, para esto, vamos a instalar PostMan para Chrome, puedes utilizar cualquier otro cliente, el que gustes.

image

Luego de instalado revisemos brevemente la REST API de Mobilse Services, esta esta basado en la siguiente estructura:

http://Mobileservice.azure-mobile.net/tables/*

En donde Mobileservice.azure corresponde a tu servicio móvil, luego se hace referencia a la tabla y luego a la tabla en particular. Para este ejemplo, utilizaré https://peliculassinet.azure-mobile.net/

Las acciones que vamos a poder realizar (según los permisos de usuarios ) son las siguientes:

image

Como vez, basados en los verbos HTTP, y la forma de acceder es bastante sencilla. Veamos las tabla Películas de mi servicio móvil en el portal:

image

A esta tabla vamos ejecutar las operaciones, pero primero debemos tener la clave del servicio para poder acceder a la API de MS, para eso vamos a al portal del AMS y pinchamos en:
image

Luego se va a abrir un panel de selección de clave:

image

y copio la clave de la aplicación, luego nos vamos a PostMan y seteamos nuestro entorno para poder generar la comunicación, para esto, debemos escribir la URL y muy importante, agregar en el header el Parámetro X-ZUMO-APPLICATION , que va a tener el valor de la llave, sin esto, no tendremos la autorización para acceder a las tablas. Puedes ver más información acá: http://msdn.microsoft.com/en-us/library/windowsazure/jj677198.aspx

image

El Preview del request generado es:

GET /Tables/Peliculas/ HTTP/1.1
Host: peliculassinet.azure-mobile.net
X-ZUMO-APPLICATION: OUkhVzulGEkkSCtMGpkVoQbEpFVJKt97
Cache-Control: no-cache
Postman-Token: 278e4f45-e557-7516-2fe9-fef34c703763

Ahora ya podemos hacer un POST también, así que vamos a setar la opción en post y agregar el JSON

image

Esto de devuelve el mismo objeto, indicándome el id generado y si voy a mi panel, veremos el registro creado:

image

Esto mismo lo puedes hacer con Javascript, Jquery o el framework que quieras, como puedes ver, es bastante sencillo y nos abre muchas posibilidades y escenarios de uso

Saludos!
@chalalo

Material y temas de la Charla de Windows Azure Mobile Services

image

Hola que tal, les quiero compartir el material de la charla de Azure Mobile Services, se que quedaron varios temas fuera, de los que voy a abordar acá en el Blog , como el tema de los permisos sobre las tablas y Auth. Pero por mientras les copio la URL en donde está el video del WebCast:

Pincha acá para ver el video:https://www150.livemeeting.com/cc/MSEvents/view?cn=guest&id=1032559265&pw=3F8D0830

El Demo visto en la charla lo puedes descargar desde acá:

Los artículos relacionados sobre el demo, los encuentras a continuación:

Parte 1: http://geeks.ms/blogs/gperez/archive/2013/07/31/azure-mobile-services-ejemplo-pr-225-ctico-con-html5-js.aspx

Parte 2: http://geeks.ms/blogs/gperez/archive/2013/08/02/comenzando-azure-mobile-services-ejemplo-pr-225-ctico-con-html5-js-parte-2.aspx

Parte 3:http://geeks.ms/blogs/gperez/archive/2013/08/08/comenzando-azure-mobile-services-ejemplo-pr-225-ctico-con-html5-js-parte-3.aspx

Saludos!,
Chalalo

Del Baúl del Recuerdo: Crear Imágenes con ASP.NET WebForm

Hola, entre tanta característica nueva de ASP.NET, de repente son varias las consultas que me llegan sobre algo en particular, en este caso, fue sobre como crear imágenes con Asp.net Webform, y como tuve que hacer algo parecido, aprovecho de escribirlo.

El problema era el siguiente, tenía que ocupar una impresora térmica de pulseras, e imprimir cierta información, si bien en la impresora se pueden enviar comandos, estoy en un cliente web, por lo que solo tenía acceso a window.print, (no tenía acceso a soluciones como las de Crystal Report que, según configuración, utilizan un activeX para enviar los datos a la impresora local). Además como era de pulsera tenia que imprimir de forma vertical, y si, sin depender de la configuración de la impresora ni utilizar CSS3, ya que debía ser compatible conversiones antiguas de IE, ni ocupar scripts. Debe permitir imprimir y cerrar automáticamente la ventana.

Entonces pensé que lo mejor era crear una imagen con el texto que quería y luego rotarla, luego implementar un poco de javascript para cerrar la ventana, veamos como queda esto:

<body onload="imprimir();">

    <form id="form1" runat="server" >

    <div>

      <img runat="server" id="pulsera" /></div>

   </form>

 

</body>

</html>

<script type="text/javascript">

   function imprimir(){

    window.print();

    setTimeout(function () {

        window.close();

    }, 6000);

   }

</script>

Esta es la pantalla que se abre como popup, se que hay mucho mejores formas de hacer esto, pero lo estoy simplificando. Tengo una imagen tiene por id=”pulsera”, y se llama en el onload del body ala función imprimir, la que imprimirá el documento y luego de 6 segundos (pueden bajar el tiempo) va a cerrar la pantalla. El comportamiento ayuda bastamente, se abre la pantalla de impresión y puede que pasen los 6 segundos antes de apretar imprimir, pero debido a que la pantalla de dialogo está abierta, no pagina no se cierra, una vez que pones imprimir, se ejecuta la petición de cerrarla.

Ahora bien, si me preguntan por que no utilicé jquery para esto, respuesta: porque es un despropósito utilizarlo para utilizarlo en un 0,000001%

Veamos el código VB.NET Asociado:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  If Not Page.IsPostBack Then

    Dim nombre As String = Request("nombre")

    Dim rut As String = Request("rut")

    Dim edad As String = Request("edad")

    Dim estab As String = Request("estab")

    Dim parametros As String = String.Format("?nombre={0}&rut={1}&edad={2}&estab={3}", nombre, rut, edad.Replace(")", "").Replace("(", ""), estab)

    pulsera.Src = "GeneraPulseraIMG.aspx" & parametros

End If

End Sub

Puedes notar que la ruta de la imagen es en realidad una página asp.net a la que se le pasan los parametros necesarios para generar la imagen. Ahora veamos la página generaPulseraIMG.aspx

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            Dim texto As String = Request("texto")

 

        Dim nombre As String = Request("nombre")

        Dim rut As String = Request("rut")

        Dim edad As String = Request("edad")

        Dim estab As String = Request("estab")

 

        Dim objLienzo As Bitmap = New Bitmap(800, 70)

        Dim objGraficar As Graphics = Graphics.FromImage(objLienzo)

        Dim objColor As System.Drawing.Color

        objColor = Color.White

        Dim objFont As New Font("Verdana", 12)

        Dim objCoordenadas As New PointF(50, 10)

        Dim objPincelFondo As New SolidBrush(objColor)

        Dim objPincelTexto As New SolidBrush(Color.Black)

        objGraficar.FillRectangle(objPincelFondo, 0, 0, 800, 70)

 

        ‘TITULO

        objGraficar.DrawString(estab, objFont, objPincelTexto, objCoordenadas)

       

‘PACIENTE

        Dim objCoordenadasPaciente As New PointF(50, 26)

        Dim objFontPaciente As New Font("Verdana", 10)

        objGraficar.DrawString("Paciente:" & nombre, objFontPaciente, objPincelTexto, objCoordenadasPaciente)

 

        ‘TERCERA LINEA

        Dim objCoordenadasTercera As New PointF(50, 40)

        objGraficar.DrawString("Rut:" & rut & " Edad:" & edad & " ", objFontPaciente, objPincelTexto, objCoordenadasTercera)

      

        objLienzo.RotateFlip(RotateFlipType.Rotate270FlipXY)

        Context.Response.ContentType = "image/jpeg"

        objLienzo.Save(Context.Response.OutputStream, ImageFormat.Jpeg)

    End Sub

Puedes ver que esta página es la que genera la imagen utilizando el namespace System.drawing de manera de crear un lienzo,darle dimensiones, y graficar Sonrisa. Grafíco las 3 líneas y luego con RotateFlip, roto la imagen, finalmente el content-type es una imagen, para que pueda ser fuente del objeto imagen de la página anterior y listo (el tema de los tildes solo es codificación):

image

Invitacion a Evento – Webcast MSDN Latam: Aplicaciones Web en la nube con alimentación en Minutos con Windows Azure Mobile Services‏

image

Hola!, los quería invitar a este evento en donde voy a ser speaker, se trata de crear aplicaciones en la nube con Azure Mobile Services, en donde vamos a revisar los conceptos necesarios para comenzar y a a desarrollar una aplicación web móvil que aproveche la potencialidad de esta plataforma. También revisaremos como crear apps con Android y Windows Phone que permitan conectarse a esta plataforma.

Fecha:viernes, septiembre 20, 2013, de 5:00PM a 6:00PM

Los datos para inscribirse!
https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032559265&Culture=es-AR&community=0

Nos vemos ahí!

Tips-Utilizar WebServices con JSONP, ejemplo práctico

Hola que tal, acá algo que te puede servir. Cuando queremos hacer una petición por ajax, y estamos en otro dominio, te podrás haber percatado que el server envía un bonito mensaje “Access to restricted URI denied”, y es que por motivos de seguridad parece lógico, cuando todo esto partió, que Ajax no funcione en dominios distintos al que lanza el request, pero sinceramente, hoy en día se hace necesario el poder usar servicios web desde el lado del cliente a dominios diferentes. Para estoy hay varias técnicas, como Cors, XMLHttpRequest Level 2 y JSONP (JavaScript Object Notation with Padding), que básicamente es la llamada mediante JSON a dominios diferentes, en este articulo vamos a ver esta última técnica con un ejemplo sencillo(y por esta vez, sin mucha teoría), personalmente hace un tiempo tuve que implementarlo y fue bastante sencillo.

Utilicé jQuery para la llamada, que debe seguir ciertos patrones:

  • Tu llamada hazla con el verbo http GET
  • Setea crossDomain en true
  • Define la URI con el primer parametro como callback
  • Setea el DataType como “JSONP”

function LlamadaJSONP(param1, param2){

   $.ajax({
          type: "GET",
          crossDomain: true,
          contentType: "application/json; charset=utf-8",
      url: http://otrodominio/myws.asmx/NombreWebmethod?callback=?,
          data: {ID_Param1: param1,ID_Param2: param2 },
      dataType: ‘jsonp’,
          success: function(msg) { 
                    AjaxOK(msg);
                 },
                 error: AjaxError
            });

            function AjaxOK(result) {
                alert(result.d);
            } 
            function AjaxError(result) { 
                 alert("ERROR " + result.status + ‘ ‘ + result.statusText);
             }
}    
        
La variable callback nos sirve para que se devuelva el JSON como una llamada a una función. Esto nos permite el NO hacer una llamada Ajax real , si no incluir el archivo como script (y ahi si se permite las llamadas a otros dominios).

El Webmethod simplemente lo marqué con los siguientes atributos(no quise agregar el cuerpo del webmethod, ya que no influía para el ejemplo)

<ScriptMethod(UseHttpGet:=True,ResponseFormat:=ResponseFormat.JSON)

Puede que te encuentres con el siguiente error: Request format is unrecognized for URL unexpectedly ending in XXXXXX, para esto, lo solucionas agregando en el Web.config

<webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
</webServices>

y listo!, funcionando sin problemas Sonrisa, problema del dominio cruzado solucionado.
Espero que te sirva
@chalalo!