GitHub Pages: API REST JSON estática

GitHub: static-rest-json-api.

Llamadas ejemplo:

GitHub Pages no sólo vale para albergar sitios Web. Podemos usarlo para crear un servidor REST con datos estáticos JSON (o cualquier otro formato de texto plano como CSV).  Vamos a guardar en el mismo proyecto el cliente que realice consultas en JS (de lectura sólo claro) y los ficheros JSON con la base de datos.

Lo único que hay que hacer es crear un nuevo proyecto y en las opciones de configuración convertirlo en una página Web.

Lo siguiente es crear un fichero de ejemplo, users.json.

 

Ya podemos observar el resultado de la llamada con este enlace.

Si queremos analizar con más detalle la llamada podemos usar la aplicación Postman para Chrome.

Ahora implementamos un cliente básico de consulta users_get_test.html:

Ejecutamos el test en el navegador y observamos el resultado en la consola:

Enlaces externos

Anuncios

C# HTTPRequestServer: Tratamiento de llamadas HTTP del cliente

En el siguiente post voy a describir un mecanismo para definir recursos que capturen cada tipo de llamada del cliente HTTP. Este diseño es muy flexible y se pueden añadir nuevas llamadas en forma de clases bien aisladas.

Ejemplos de llamada:

  • http://localhost:8080/Client?name=Iker.  Esta llamada será redirigida por el localizador de recursos al capturador adecuado para su tratamiento ClientHttpRequestHandler.
  • Lo mismo pasa para consultar la información de un producto ficticio llamando a http://localhost:8080/Product se asocia al manejador ProductHttpRequestHandler.
  • Una llamada especial InvalidHttpRequestHandler se ocupa de las llamadas de clientes a recursos que no existen http://localhost:8080/Sales.

Interface HttpRequestHandler

Una interfaz contiene solo las firmas de los métodos, más adelante veremos que cada clase que captura una llamada (por ejemplo ProductHttpRequestHandler) hereda de la interfaz pública HttpRequestHandler y define estos métodos:

  • Handle: Función capturadora de cada recurso que realiza un tratamiento especifico de la llamada del cliente.
  • GetName: Retorna una cadena con el nombre del recurso (“Product”, “Client”…) para que HttpResourceLocator pueda localizar el manejador adecuado para cada llamada.

 

Implementaciones de interface HttpRequestHandler

Las clases heredadas del interface HttpRequestHandler son las encargadas del tratamiento de cada mensaje. Cada clase tratará un tipo de mensaje, las clases implementan la definición de los dos métodos del interface:

  • GetName: Retorna el atributo de la clase con el nombre del recurso para facilitar su identificación por parte del localizador de recursos.
  • Handle: Contiene el tratamiento de la llamada, recibe como parámetro una instancia de la clase HttpListenerContext que proporciona acceso a todos los datos de la llamada (por ejemplo el nombre del cliente en la URL) y la respuesta.

ProductHttpRequestHandler

Esta clase permite obtener información de un producto pasando el nombre como parámetro en la URL.

InvalidHttpRequestHandler: Manejador para recursos no encontrados

Esta clase es algo especial, informa al cliente de que un recurso no existe con el código HTTP 404 (Not Found).

HttpResourceLocator: Localizador de recursos

La clase HttpResourceLocator registra los capturadores de cada llamada HttpRequestHandler dentro de su atributo privado _httpRequestHandlers en forma de diccionario, la clase Dictionary representa una colección de elementos clave-valor. La clave está representada con una cadena que contiene el nombre del recurso (“Product”, “Client”) para poder localizarlo, el valor es el interface HttpRequestHandler.

El constructor de la clase HttpResourceLocator instancia la clase Dictionary y registra el manejador InvalidHttpRequestHandler para retornar 404 cuando no encuentra un recurso.

El método público AddHttpRequestHandler  registra las clases de tratamiento de las llamadas basadas en el interface HttpRequestHandler pasados como entrada al método.

HttpServer: Servidor Web principal

 

 

Ejecución

Post relacionados

Enlaces externos

C# WinServiceBasic1 v1.1.0: Servicio con servidor HTTP

El servicio que he programado hasta ahora no ofrece ninguna funcionalidad, uno de los usos más habituales es ofrecer un puerto abierto a la escucha para comunicarse con otras aplicaciones en red que ejercen de clientes. En vez de inventar un nuevo protocolo vamos a usar uno reconocido, usando la clase HttpListener vamos a crear un servidor HTTP muy sencillo (espacio de nombres “using System.Net”);

Proyecto en GitHub (v1.1.0)

Clase WebServer

Vamos a crear una clase WebServer que agrupa todas las funcionalidades de nuestro servidor Web. Solo contiene dos atributos privados:

  • _listener: Una instancia de la clase HttpListener.
  • _responderMethod: El capturador de evento cuando un cliente se conecta.

Los métodos que ofrece son tres:

  • WebServer: El constructor de la clase, recibe la URL donde se pondrá a la escucha (por ejemplo “http://localhost:8080/test/” y la función externa a la clase que genera la respuesta al cliente (_responderMethod).  La parte más interesante del constructor es la llamada a _listener.Start().
  • Run: Este método no acepta parámetros. Emplea el método IsListening de HttpListener para determinar si se ha iniciado. La clase  HttpListenerContext proporciona acceso a los objetos de solicitud y respuesta utilizados por la clase HttpListener.  Llama al método interno que apunta a la función que captura la solicitud cliente “_responderMethod(ctx.Request);” y con la respuesta la redirecciona al cliente HTTP.
  • Stop: Este método es muy simple, llama a la Stop y Close de HttpListener.

Ejecución

Ejecutamos e introducimos la siguiente URL en nuestro navegador para ver el resultado: http://localhost:8080/test/.

Posts relacionados

Referencias Externas

 

 

Protocolos M2M en la nueva era de la IoT

internet-of-things-graphic-story-top

Protocolos M2M en la nueva era de la IoT

Me parece que me ha quedado un título de post algo presuntuoso, el objeto del texto que sigue es recopilar algunos protocolos que se están imponiendo y por ende estandarizándose en las comunicaciones M2M (Machine To Machine).

Internet de las cosas (IoT por sus siglas en ingles Internet of Things) es un termino acuñado recientemente y que está de moda en textos técnicos en Internet, básicamente se refiere a la interconexión digital de objetos cotidianos a Internet, con la proliferación de pequeños dispositivos de captación de datos instalados en cualquier objeto cotidiano estos pueden ser controlados y los datos producidos explotados de manera “inteligente” en la nube (flotas de vehiculos, ). Iot también se refiere al momento en que los dispositivos conectados a la red de redes sean mayor en número que las propias personas. Todos estos dispositivos conectados a Internet de manera heterogénea a su vez producen datos de forma masiva a gran escala, la necesidad de almacenar y explotar estos datos de manera no convencional nos conduce a otro termino denominado Big Data, pero imagino que esto ya es otro tema.

Buceando por Internet me he topado con más información de la que esperaba y que se puede encontrar en los enlaces al final del post, imagino que el reto consiste en un protocolo multiplataforma y ligero que se pueda implementar en cualquier plataforma. Estas comunicaciones deben poder implementarse para luchar contra algunas barreras inherentes a estos dispositivos como un limitado ancho de banda caidas casuales, otros problemas que podemos citar es su limitada capacidad de procesamiento y la necesidad de minimizar su consumo de energia.

Como resultante de todas estas propiedades estos dispositvos requieren características propias en la comunicación M2M, al calor de este nuevo mercado emergente sugen uniones de empresas y grupos que quieren liderar el desarrollo de un estandar como el grupo formado por Sierra Wireless, la fundación Eclipse y IBM entre otros (M2M Magazine “Sierra Wireless, IBM, Eurotech create M2M Group“). Otros grupos industriales como la Open Mobile Alliance (OMA) también estan trabajando duro en esta dirección.

+INFO:

PROTOCOLOS

HTTP y REST

Hypertext Transfer Protocol (HTTP) es la vida de la Web, se usa cada vez que transferimos un documento o consultamos una página. REST es una forma simple para organizar la interacción entre sistemas independientes. se emplea por ejemplo en la API de Twitter, gracias a que los datos necesarios para transferir datos mediante este sistema no consume excesivo ancho de banda. REST está inspirado por el protocolo HTTP y en la practica significa que podemos usarlo donde usemos un protocolo en HTTP como un servidor Web.

Otras alternativas como SOAP son algo más complejos y estan basados en lenguaje XML, requieren un estudio conciencudo de su sintaxis.

En el protocolo HTTP las maquinas juegan dos roles diferentes: Cliente y servidor. En la mayoria de los casos el cliente inicia la comunicación y el servidor responde. HTTP está basado en carácteres de texto aunque el cuerpo del mensaje puede contener otro tipo de datos como una imagen. Un mensaje HTTP está formado por una cabecera y un cuerpo a pesar de que el cuerpo a menudo puede ir vacio, el cuerpo contiene los datos interpretados como indica la cabecera.

Con Chrome Developer Tools, o Firefox con Firebug podemos espiar las peticiones HTTP en acción.

 CapturaOtro herramienta para familiarizarse con el protocolo HTTP es cURL.

cURL es una herramienta para usar en un intérprete de comandos para transferir archivos con sintaxis URL, soporta FTP,FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP.

[…]

Es por ejemplo una buena herramienta para simular las acciones de un usuario en un navegador web. Libcurl es la biblioteca/API correspondiente que los usuarios pueden incorporar en sus programas;

Para realizar pruebas con cURL nos montaremos nuestro propio servidor Web, con XAMPP  (Apache + MySQL + PHP + Perl) tenemos una distribución de Apache instalada en un periquete.

cURL suele estar disponible por defecto en muchas distribuciones Linux, en cuanto a Micro$oft esto ya es otro cantar, seleccionamos de la página oficial de descargas en http://curl.haxx.se/download.html (la versión 7.3.9 para Win32 que finalmente bajamos de aquí).

Una vez instalado cURL realizamos nuestra primera prueba, el comando:

curl.exe -v google.com

Nos muestra el dialogo HTTP que mantiene cURL para obtener la página solicitada (peticiones precedidas con “>” y respuestas con “>”).

Captura

Sintaxis

Una URL nos permite identificar el objeto sobre el que vamos a operar, cada URL identifica un recurso, vamos a verlo más claro, supongamos que queremos obtener una lista de clientes de nuestra compañía, el recurso podría ser:

/clients

Si quisiéramos buscar un cliente concreto:

/clients/jim

Asumiendo que sólo hay un cliente con ese nombre. Si lo completamos la llamada quedaría como queda:

GET /clients/jim HTTP/1.1
Host: example.com

Es un error muy común y que debemos evitar es usar la URL para describir la acción por ejemplo: /clients/add.

¿Pero como especificamos una acción? Los métodos HTTP vienen a nuestro rescate para este menester.

Más arriba hemos usado el método GET pero podemos usar otros métodos por ejemplo para borrar un cliente llamado “anne” de nuestra base de datos:

DELETE /clients/anne HTTP/1.1

Los métodos HTTP indican que operación realizar con el recurso solicitado en la URL. La petición puede tener información extra en el cuerpo del mensaje (en cURL podemos proporcionar estos datos usando la opción -d).

Los métodos más importantes son los siguientes: GET, POST, PUT y DELETE (podemos encontrar todas las opciones en IETF).

+INFO:

Cliente HTTP GET en C con WinInet (MS VS 2008)

#include "stdafx.h"
#include<windows.h>
#include<wininet.h>
#include<stdio.h>
#pragma comment(lib, "wininet.lib")

int _tmain(int argc, _TCHAR* argv[])
{
 HINTERNET Initialize,Connection,File = NULL;
 DWORD dwBytes;
 char ch;

 Initialize = InternetOpen(L"Mozilla/4.0 (compatible)", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
 if (Initialize == NULL)
 {
      printf("Error InternetOpen rets %s\n", "null");
 }

Connection = InternetConnect(Initialize, L"127.0.0.1",  INTERNET_DEFAULT_HTTP_PORT,  NULL,  NULL,  INTERNET_SERVICE_HTTP, 0,  0);
 if (Initialize == NULL)
 {
     printf("Error InternetConnect rets %s\n", "null");
 }

 File = HttpOpenRequest(Connection,NULL,L"/index.php?var1=val1&var2=val2",NULL,NULL,NULL,0,0);
 if (File == NULL)
 {
 printf("Error HttpOpenRequest rets %s\n", "null");
 }

 if(HttpSendRequest(File,NULL,0,NULL,0))
 {
 while(InternetReadFile(File,&ch,1,&dwBytes))
 {
 if(dwBytes != 1)break;
 putchar(ch);
 }
 }
 else
 {
 printf("Error HttpSendRequest rets %s\n", "null");
 }
 InternetCloseHandle(File);
 InternetCloseHandle(Connection);
 InternetCloseHandle(Initialize);
 return 0;
}

Servidor PHP


<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de procesado</H1>
<?php var_dump($_GET) ?>
<br>
</body>
</html>

Resultado ejecución aplicación WinInet

Captura

+INFO: