Archivo del sitio

Consumiendo WCF Rest con Windows Form


Perdonad, por la mala escritura, pero creo que he bebido de más en fín hoy finalze la investigación de Windows Fom Conectandose a WCF mediante un Servicio REST como era de esperarse las cosas casi se hacen solitas, aún que sigo pensando que JavaScript es más mono! en fín vamos a divertirnos en laentrega anterior hemos creado un WCF que Diseñado mediante REST por ahí anda el ejemplo ahorita no me encuentro en condiciones de ponerlo más sin embargo, para poder utilizarlo he creado un Helper diría el purista, tú y los Helpers! me vale este es mí Blog y me mofo de quien quiero sí de por sí los hago en su cara jajajaja bien veamos el código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace EjemploConsumoRest.Helpers
{
    public static class RESTHeper
    {
        public static string Ejecutar(string Url, string Datos, string Metodo)
        {
            byte[] data = UTF8Encoding.UTF8.GetBytes(Datos);

            HttpWebRequest request;
            request = WebRequest.Create("http://localhost/Estudiantes/Listar") as HttpWebRequest;
            request.Timeout = 10 * 1000;
            request.Method = Metodo;
            request.ContentLength = data.Length;
            request.ContentType = "application/json; charset=utf-8";
            Stream postStream = request.GetRequestStream();
            postStream.Write(data, 0, data.Length);

            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            StreamReader reader = new StreamReader(response.GetResponseStream());
            string json = reader.ReadToEnd();

            return ClearJSON(json);
        }

        private static string ClearJSON(string Json) {
            if (Json.IndexOf("{\"MuestraEstudiantesResult\":") > -1)
            {
                Json = Json.Replace("{\"MuestraEstudiantesResult\":", "");
                Json = Json.Remove(Json.Length - 1);
            }
            return Json;
        }
    }
}

Ahora bien se preguntarán por que el Metodo ClearJSON bien, como recordarán en alguna ocación hicimos la clase JSONHelper que nos permite contraer los datos de manera simple a una clase ya establecida de.Net bien está es la parte bonita de los anteriores desarrollos, esa misma clase nos sirve para devolver el JSON a una Clase que comprenda .Net podemos ver el Enlace Aquí, el problema es que .Net es muy purista, y me regresa información que no necesito por eso está el metodo ClearJSON toda la basura de más es posible limpiarla siguiendo el contexto eslse if de cualquier manera vuelvo a dejar el código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
namespace JSONHelper
{
public static class JsonSerializer
{
///
/// Método extensor para serializar un string a JSON
///
public static string SerializaToJson(this object objeto)
{
string jsonResult = string.Empty;
try
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(objeto.GetType());
MemoryStream ms = new MemoryStream();
jsonSerializer.WriteObject(ms, objeto);
jsonResult = Encoding.Default.GetString(ms.ToArray());
}
catch { throw; }
return jsonResult;
}
///
;
/// Método extensor para deserializar JSON cualquier objeto
///
;
public static T DeserializarJsonTo(this string jsonSerializado)
{
try
{
T obj = Activator.CreateInstance();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonSerializado));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
ms.Close();
ms.Dispose();
return obj;
}
catch { return default(T); }
}
}
}

y la clase estudiante como ya la conocen los que analizarón el anterior post que está Aquí Es la siguiente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EjemploConsumoRest
{
    public class Estudiante
    {
        public string Nombre { get; set; }
        public string Paterno { get; set; }
        public string Materno { get; set; }
    }
}

meteremos un DataGridView y lo enlazaremos de la siguiente manera en el From:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using RESTHeper;
using JSONHelper;

namespace EjemploConsumoRest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string url = "http://localhost:45597/Estudiantes.svc/Listar/";
            string Datos = "";
            string resp = RESTHeper.RESTHeper.Ejecutar(url, Datos, "POST");
            List lstEstudiante = resp.DeserializarJsonTo();
            dgvEstudiantes.DataSource = lstEstudiante;
        }
    }
}

como pueden vereso nos obligará a hacer el cambio en el metodo de IEstudiantes en el wsREST del ejemplo anterior por el siguiente:

        [OperationContract]
        [WebInvoke(Method= "POST", RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json, UriTemplate = "/Listar/", BodyStyle=WebMessageBodyStyle.Wrapped)]
        List MuestraEstudiantes();

Les dejo como siempreo casisiempre elcódigo de descarga y apuro este whisky para irme a dormir :P,por cierto para los que tienen problemas con que la URL no es encontrada seria bueno que checaran el puerto.

EjemploConsumoRest (Download)

Anuncios

ServiciosWeb con REST y WCF


Para información muy bien documentada de REST podemos pasarnos por este blog http://www.dnmplus.net/articulos/acercandonos-a-rest-sigilosamente-(y-ii).aspx

Para comenzar abriremos un nuevo proyecto en VisualStudio 2010 y daremos clic a New Proyect nos iremos al menú que dice Installed Templates y seleccionaremos WCF Service Aplication, una vez creado el proyecto modificaremos los nombres de Service1.svc y IService1.cs po Estudiantes.svc y IEstudiantes.cs respectivamente y crearemos agregaremos al proyecto una clase nueva llamada Estudiante.cs que solo contendrá la clase para utilizar.

Código de Estudiantes.svc

<%@ <span class="hiddenSpellError">ServiceHost</span>  Language="C#"  Debug="true"  Service="wsREST.Estudiantes"  CodeBehind="Estudiantes.svc.cs"  Factory = "System.ServiceModel.Activation.WebServiceHostFactory" %>

Estudiantes.svc lo pueden editar dando clic en el botón derecho y seleccionado la opción View Markup y de toda la linea la más importante es Factory = “System.ServiceModel.Activation.WebServiceHostFactory” que de hecho es la que deben agregar.

Código de Estudiantes.svc.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace wsREST
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
public class Estudiantes : IEstudiantes
    {
public List MuestraEstudiantes()
        {
List respuesta = new List();
respuesta.Add(new Estudiante { Nombre = "Francisco", Paterno = "Castán", Materno = "Gutiérrez" });
return respuesta;
        }
    }
}

Código de IEstudiantes.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace wsREST
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IEstudiantes
    {

[OperationContract]
[WebGet(RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json, UriTemplate = "/Listar/", BodyStyle=WebMessageBodyStyle.Wrapped)]
List MuestraEstudiantes();
    }
}

Aquí con la siguiente linea le decimos al compilador que la información de respuesta es en JSON ResponseFormat=WebMessageFormat.Json, por defecto la regresará en XML.

Código de Estudiante.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization;

namespace wsREST
{
[DataContract]
public class Estudiante
    {
[DataMember]
public string Nombre { get; set; }
[DataMember]
public string Paterno { get; set; }
[DataMember]
public string Materno { get; set; }
    }
}

Los DataContractn y los DataMember nos permiten hacer serializable la clase, con esto el control para dispositivos móviles ya facilmente escalable a cualquier aplicación que tengamos…

Ejemplo (Download)

WebServices en REST con PHPDBC


La Transferencia de Estado Representacional (Representational State Transfer) o REST. Para leer más teoría sobre REST aquí.

Bien dado que la teoria no es lo mio comenzaremos con la creación de un pequeño WebService de ABM pero nuestro servicio regresará JSON y utulizaremos a demás PHPDBC manos a la obra, nuestro árbol de archivos tiene que quedar de la siguiente manera:

  • index.php
  • .htaccess
  • includes
    • phpdbc2.min.php
  • modulos
    • item.php

index.php

<!--?php -->include("includes/phpdbc2.min.php");

//Comienzan los metodos del servicio
include("modulos/item.php");

$path = parse_url($_SERVER["REQUEST_URI"], 5);
$path = str_replace("/RESTTutorialRapido/", "", $path);
$path = trim($path, "/");
@list($resource, $params) = explode("/", $path, 2);
$resource = ucfirst(strtolower($resource));
$method = strtolower($_SERVER["REQUEST_METHOD"]);
$params = !empty($params) ? explode("/", $params) : array();

if (class_exists($resource)) {
try {
$resource = new $resource($params);
$resource->{$method}();
}
catch (Exception $e) {
@header("HTTP/1.1 500 Internal Server Error");
}
}
else {
@header("HTTP/1.1 404 File Not Found");
}
?>

Como podrán ver hicimos un cambio con la estructura que manejabamos con NuSOAP con este cambio podemos manejar la información como si fueran recursos un ejemplo de como accesar es:

http://127.0.0.1:4001/RESTTutorialRapido/Item/Agregar/Pluma/Esta es una pluma/

Agregar: es el nombre del metodo.
Pluma: es el nombre del elemento.
Esta es una pluma: es la descripcion de la pluma.

http://127.0.0.1:4001/RESTTutorialRapido/Item/Editar/Pluma Roja/Estoy modificando la pluma/1/

Agregar: es el nombre del metodo.
Pluma: es el nombre del elemento.
Esta es una pluma: es la descripcion de la pluma.
1: id del elemento.

http://127.0.0.1:4001/RESTTutorialRapido/Item/Eliminar/1/

1: id del elemento.

http://127.0.0.1:4001/RESTTutorialRapido/Item/Listar/0/30/

0: El número de registro donde veremos la información
30: El número de registros que serán mostrados

.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /RESTTutorialRapido/index.php

Podemos ver en el .htaccess una linea quenos interesará mucho que es /RESTTutorialRapido/index.php para un dominio comprado /RESTTutorialRapido/ esta linea la podemos quitar.

item.php

<!--?php -->class Item
{
var $params;
var $db;

function Item($params="") {
$this->params = $params;
}

function get() {

$this->db = new db("localhost","root","","PHPDBC","MySQL");
$this->db->conectar();

switch ($this->params[0]) {
case "Agregar":
$this->Agregar();
break;
case "Editar":
$this->Editar();
break;
case "Eliminar":
$this->Eliminar();
break;
case "Listar":
$this->Listar();
break;
}
$this->db->desconectar();
}

function post() {

}

function Agregar() {
$nombre = urldecode($this->params[1]);
$descripcion = urldecode($this->params[2]);

$INSERT="INSERT INTO items (Nombre,Descripcion) VALUES ('".$nombre."','".$descripcion."')";
$this->db->query($INSERT);
$resp["Ok"] = true;
if (!empty($this->db->Error)) {
$resp["Ok"] = false;
$resp["Mensaje"] = $this->db->Error;
}
echo json_encode($resp);
}

function Editar() {
$nombre = urldecode($this->params[1]);
$descripcion = urldecode($this->params[2]);
$itemId = urldecode($this->params[3]);

$UPDATE="UPDATE items SET Nombre='".$nombre."',Descripcion='".$descripcion."' WHERE itemId = ".$itemId;
$this->db->query($UPDATE);
$resp["Ok"] = true;
if (!empty($this->db->Error)) {
$resp["Ok"] = false;
$resp["Mensaje"] = $this->db->Error;
}
echo json_encode($resp);
}

function Eliminar() {
$itemId = urldecode($this->params[1]);

$DELETE="DELETE FROM items WHERE itemId = ".$itemId;
$this->db->query($DELETE);
$resp["Ok"] = true;
if (!empty($this->db->Error)) {
$resp["Ok"] = false;
$resp["Mensaje"] = $this->db->Error;
}
echo json_encode($resp);
}

function Listar() {
if (!empty($this->params[1])) {
$NoRegistro = $this->params[1];
} else { $NoRegistro = 0; }
if (!empty($this->params[2])) {
$LimiteRegistro = $this->params[2];
} else { $LimiteRegistro= 30; }

$SELECT="SELECT itemId, Nombre, Descripcion FROM items LIMIT " . $NoRegistro . " , " . $LimiteRegistro;
$this->db->query($SELECT);
echo $this->db->JSON();
}

}
?>

Como podemos ver se genero una clase  muy simple, el sistema que tenemos en el index.php nos permitirá llamar a los metodos y además nos enviará las propiedades para poder utilizarlas, el PHPDBC nos da la tranquilidad de las conecciones a SQL.

Con esto terminamos el tutorial de REST

Ver el Tutorial de Programación Móvil
RESTTutorialRapido Download

Programación en Dispositivos Moviles


La generalización de dispositivos moviles en los últimos años ha generado una importante necesidad de aplicaciónes para dichos dispositivos, los perifericos que nos permiten estos dispositivos tales como:

  • Acceso a internernet
  • Conectividad mediante Bluetoot
  • Envio de mensajes cortos
  • Aceleración 2D y 3D
  • Reproducción de video y sonido
  • Integración de la camara
  • Información de la localización GPS
  • Sensores de orientación
  • Storage Propio

Tambien tenemos la otra cara, y esto nos indica el cuidado que debemos tener al realizar una aplicación movil:

  • La necesidad de ahorrar bateria
  • Procesadores en algunos casos limitados (Dios bendiga al Galaxy 3)
  • La memoria disponible es limitada en algunos equipos
  • El almacenamiento de datos persistente tambien es limitado (Memoria interna y algunas tarjetas SD).

Los diferentes sistemas operativos para los dispositivos tambien es una problematica podemos encontrar una gran variedad, como lo son:

  • Symbian
  • Windows Mobile
  • Android
  • RIM BlackBerry
  • iOS

Y esto no quiere decir que sea en ese orden, pero la realidad que las problematicas a saltar son complicadas, por otro lado, cada sistema operativo tiene su propio amor por un lenguaje en particular, lo que complica aun más el desarrollo de los mismos.

Por lo tanto en esta ocación veremos una parte divertida del desarrollo móvil, para los que saben HTML esto les vendrá de perlas y comenzaremos aprendiendo a utilizar las herramientas desde lo más simple hasta lo más “complicado” el orden del Temario será el siguiente:

Esto nos permitirá crear y desarrollar aplicaciones a nivel móvil y además exportarlas a los diferentes sistemas operativos

A %d blogueros les gusta esto: