lunes, 28 de octubre de 2013

Envío de correos sobre CodeIgniter

 

En el artículo anterior “CKEditor + KCFinder sobre CodeIgniter”, te comentaba sobre la integración de una interfaz WYSIWYG sobre Codeigniter. En este artículo te hablaré sobre la utilidad del CKEditor en combinación con la clase email de CodeIgniter para hacer un formulario de envío de correos.

En la ayuda de CodeIgniter puedes encontrar que con la biblioteca email puedes hacer:

$this->load->library('email');

$this->email->from('your@example.com', 'Your Name');
$this->email->to('someone@example.com');
$this->email->cc('another@another-example.com');
$this->email->bcc('them@their-example.com');
$this->email->attach('/path/to/photo1.jpg');
$this->email->attach('/path/to/photo2.jpg');
$this->email->subject('Email Test');
$this->email->message('Testing the email class.');
$this->email->send();

Está muy claro: cargas la biblioteca, defines remitente, destinatarios, adjuntos, título y cuerpo del mensaje, y lo mandas. Es todo lo que necesitas para enviar correos.

Para facilitar las cosas, en nuestro caso hicimos una biblioteca “mail_manager” dentro de application/libraries/mail_manager.php y un fichero de configuración en application/config/mail_config.php.

El fichero de configuración tiene un destinatario FROM por defecto con su nombre, y el tipo de correos (html). Así que en el constructor de mail_manager se carga la biblioteca email de Codeigniter, se carga el fichero de configuración mail_config, y se inicializa la clase email de CodeIgniter con la configuración cargada.

Adicionamos entonces una función send a mail_manager que básicamente recibe los argumentos y hace las llamadas a email indicadas en el grupo de código de arriba.

send($from, $name, $to, $subject, $body, $cc='', $bcc='', $attach_array='')

Con esto ya se pueden mandar correos automáticos, por ejemplo cuando alguien se registra se le envía el correo de “Usted se ha registrado…”.

En otra parte necesitamos que el usuario enviara correos con un formulario. Aquí utilizamos entonces el CKEditor para lograr la siguiente interfaz:

clip_image002

Figura 1 Interfaz de envío de correos

Claro que para esto creamos un controlador “emailer” en cuyo constructor se configura un CKEditor y se envía una instancia del mismo para esta vista (ver artículo CKEditor + KCFinder sobre CodeIgniter).

El botón “Para” de la vista abre una ventana popup donde se pueden seleccionar destinatarios; y el botón “Buscar” permite seleccionar un atachado, que con un poco de jquery modifica la vista cada vez que se selecciona un adjunto, permitiendo eliminarlo nuevamente u obtener una vista previa de él, o seleccionar un nuevo atachado (figura 2).

clip_image003


Figura 2 Detalle de inserción de atachados

Cuando se da “Enviar”, el controlador emailer recibe los inputs y llama a la función “send” de la biblioteca mail_manager.

Con esto quedó terminado nuestro formulario para envío de correos, una mezcla de componentes visuales de html y bibliotecas y utilidades de CodeIgniter para lograr una interfaz agradable y funcional.

{ Leer Más }


lunes, 21 de octubre de 2013

PL/pgsql

 

Vamos a abordar un tema muy importante para el desarrollo de cualquier proyecto, en este caso visto desde la parte de las base de datos y es precisamente el uso los procedimientos almacenados, en caso de postgreSQL las funciones, en otras palabras vamos a utilizar el lenguaje procedural PL/pgSQL de PostgreSQL en la resolución de problemas.

image


Ventajas

  • Cuando la ejecución del procedimiento ocurre en el servidor, es probable que aumente el rendimiento de nuestra aplicación al no tenerse que mandar datos entre el cliente y el servidor, y no tener que procesar resultados intermedios en el cliente para obtener el resultado final.
  • Al tener la lógica de la aplicación implementada en la Base de datos no tendremos que implantarla en los clientes, con el significativo ahorro de líneas de código redundante.
  • Si tenemos diferentes tipos de clientes implementados en diferentes sistemas ó lenguajes de programación y a la vez accediendo a la misma base de datos, no tendremos que programar la misma lógica en todos, al estar disponible en la base de datos la solución de nuestro problema.

Los procedimientos almacenados (stored procedures) en PostgreSQL se les llaman funciones, las cuales están almacenadas en la base de datos y listas para ser usadas. En postgreSQL se utiliza para la programación de funciones los lenguajes procedurales.

Lenguajes procedurales

PL/Perl: Es un lenguaje de programación imperativo y permite más control que el álgebra relacional de SQL.

PL/Python: Utiliza el entorno de ejecución de Python restringido. Funciona como un lenguaje de confianza.

PL/Java: Es un módulo libre que trae procedimientos almacenados, disparadores, y funciones para PostgreSQL backend a través de la interfaz estándar JDBC.

Y el PL/pgSQL es muy parecido al lenguaje PL/SQL utilizado por Oracle, es fácil de aprender, potente y siempre está disponible. Es un lenguaje estructurado en bloques y posee como mínimo un bloque principal en el procedimiento almacenado y dentro de este pueden existir sub-bloques. El mismo se puede utilizar para crear las funciones y disparadores (triggers), este último lo explicaremos en próximos artículos.

Además con el PL/PGSQL se pueden añadir estructuras de control SQL, realizar cálculos complejos entre otra serie de operaciones muy importantes para la solución de nuestros problemas.

A continuación vamos a pasar a ver la estructura de una función para entenderla mejor:

CREATE [OR REPLACE] FUNCTION
nombre_funcion([[ argmodo ][ argnombre ] argtipo [,...]])
RETURNS tipo AS $$
[ DECLARE ]
[ declaraciones de variables ]
BEGIN
Codigo
END;
$$ LANGUAJE plpgsql

Es importante señalar que los comentarios se definen /* mi comentario */ y los tipos de datos se declaran por ejemplo id INTEGER;

De todas maneras vamos a cerrar este artículo con un ejemplo muy sencillo pero que ilustra claramente la sintaxis que acabamos de poner.

CREATE FUNCTION sumar (x integer, y integer) RETURN INTEGER AS $$
Declare
Resultado integer;
BEGIN
Resultado:=x+y;
Return resultado;
END
$$ LANGUAJE plpgsql

Las funciones se pueden complejizar tanto como queramos en nuestras soluciones, los exhortamos a que continúen abordando sobre estos temas tan importantes, comiencen a utilizar consultas dentro de las funciones y a practicar el funcionamiento de las mismas.

{ Leer Más }


viernes, 18 de octubre de 2013

CKEditor + KCFinder sobre CodeIgniter

CKEditor

CKEditor es un helper para CodeIgniter creado por Samuel Sánchez, que permite adicionar a nuestros sitios web una interfaz visual como la que se muestra en la figura 1, a modo WYSIWYG. Con este componente se le brinda a los usuarios la posibilidad de introducir texto enriquecido con fuentes y estilos de letras, hipervínculos, imágenes, etc.

clip_image001

Figura 1 Interfaz visual del CKEditor

Para acoplar CKEditor a CodeIgniter, descargas el paquete en [1] y copias el ckeditor_helper.php para tu directorio application/helpers. Luego copias el ckeditor completo para js/ckeditor (ver tutorial completo en [2]).

Una vez hecho esto creas una función en el controlador relacionado con la vista en la que quieras usar el componente, y la llamas en el constructor… esto para que no incluyas todo ese gran código en el constructor de la clase:

public $data = array();         //creación de la variable $data

function __construct()
{
parent::__construct();

$this->configure_ckeditor(); //llamada a la configuración del ckeditor
}

private function configure_ckeditor()
{
//helpers for CKEditor
$this->load->helper('url');
$this->load->helper('ckeditor');

//Ckeditor's configuration
$this->data['ckeditor'] = array
(
//ID of the textarea that will be replaced
'id' => 'content',
'path' => 'js/ckeditor',

//Optionnal values
'config' => array(
'toolbar' => "Full", //Using the Full toolbar
'width' => "550px", //Setting a custom width
'height' => '100px', //Setting a custom height
),

//definición del estilo del ckeditor

);
}

Recorté un poco el código para dejar lo fundamental: primero, creas una variable “$data” global para el controlador, y en la función que configura al ckeditor defines el id del componente visual que será reemplazado por el editor de ckeditor, en este caso se llama “content”.

Hecho esto, en la función que carga la vista deseada pasas la variable $data[ckeditor],

function load_view()
{
$data['ckeditor'] = $this->data['ckeditor'];
$this->load->view('views/my_view.php', $data);
}

Y en la vista, en el lugar donde quieras que te salga el componente, pones el siguiente código:

<?php echo form_textarea(array('name' => 'content', 'id' => 'content')); ?>

<?php echo display_ckeditor($ckeditor); ?>

Con esto lo que estamos haciendo es, que el textarea con id “content” sea reemplazado por el ckeditor que pasamos en la variable $ckeditor (recuerda que en el controlador dijimos que el componente con id “content” sería reemplazado por un ckeditor).

En el controlador capturas el contenido del componente como con cualquier otro:

$content = $this->input->post('content').

KCFinder

Bien, en la primera parte de este artículo he querido introducirte a la instalación del CKEditor sobre Codeigniter, pero la intención final es montar el KCFinder.

Como detalle, en el texto del componente ckeditor puedes insertar imágenes a través del ícono señalado en la figura 2. Esta opción abre la ventana mostrada en la figura 3, donde puedes escoger la dirección de una imagen existente en el servidor.

clip_image002

Figura 2 Opción de insertar imágenes en el texto

clip_image003

Figura 3 Ventana de inserción de imágenes

El problema está en darle a los usuarios la facilidad de subir primeramente imágenes al servidor y a la vez seleccionarlas para insertarlas en el texto del ckeditor. Aquí entra entonces el kcfinder, un explorador de imágenes, archivos genéricos y contenido flash que permite acoplarle al ckeditor los componentes necesarios para subir y seleccionar archivos.

Ojo, no confundir con CKFinder: CKFinder es de pago y KCFinder es la alternativa libre.

Una vez instalado, el kcfinder le adiciona al ckeditor la pestaña “Upload” en la ventana de selección de imágenes (figura 4) que permite subir imágenes al servidor, y adiciona el botón “Browse Server” (figura 5) que permite buscarlas y seleccionarlas para introducirlas en el texto.

clip_image004

Figura 4 Pestaña Upload

clip_image005

Figura 5 Botón "Browse Server"

Para instalar el kcfinder [3] descomprime el archivo kcfinder.zip dentro de /js/ckeditor de forma que quede así: /js/ckeditor/kcfinder.

Luego, en el controlador (en el que estamos usando como ejemplo), se configura la variable de sesión que le especifica a kcfinder el camino en el servidor:

private function configure_ckeditor()
{
$_SESSION['KCFINDER'] = array();
$_SESSION['KCFINDER']['disabled'] = false;
$_SESSION['KCFINDER']['uploadDir'] = 'C:\wamp\www\...';
$_SESSION['KCFINDER']['uploadURL'] = base_url()."images/kcfinder/";

//helpers for CKEditor
$this->load->helper('url');
$this->load->helper('ckeditor');

//Ckeditor's configuration
$this->data['ckeditor'] = array
(
//ID of the textarea that will be replaced
'id' => 'content',
'path' => 'js/ckeditor',

//Optionnal values
'config' => array(
'toolbar' => "Full", //Using the Full toolbar
'width' => "550px", //Setting a custom width
'height' => '100px', //Setting a custom height

'filebrowserImageBrowseUrl' => base_url().'js/ckeditor/kcfinder/browse.php?type=images',
'filebrowserImageUploadUrl' => base_url().'js/ckeditor/kcfinder/upload.php?type=images'
),


//definición del estilo del ckeditor

);
}

Aquí puse en negritas el código adicionado a la función configure_ckeditor. Con esto queda lista la integración del CKEditor con KCFinder sobre CodeIgniter. Puedes obtener una guía más completa de esta integración en [4].

Referencias:

[1] Descarga de CKEditor

http://ckeditor.com/download

[2] Tutorial de instalación de CKEditor sobre Codeigniter

http://kromack.com/developpement-php/codeigniter/ckeditor-helper-for-codeigniter/

[3] Descarga de KCFinder

http://kcfinder.sunhater.com/download

[4] Howto CodeIgniter 2.1 + Ckeditor 3.6.1 + kcfinder 2.51

http://www.hcosta.info/wp/2012/05/howto-codeigniter-2-1-ckeditor-3-6-1-kcfinder-2-51/

{ Leer Más }


jueves, 10 de octubre de 2013

Servicios web (webservices) con SOAP sobre CodeIgniter

(Continuación del artículo Servicios web (webservices) con REST sobre CodeIgniter)

SOAP

En la primera parte de este artículo te comenté sobre el uso de REST sobre CodeIgniter usando la biblioteca “CodeIgniter Rest Server”. A continuación de hablaré sobre el trabajo con la biblioteca nusoap para la implementación de webservices con SOAP sobre CodeIgniter.

La nusoap (versión 0.9.5) puedes descargarla en [2]. En el artículo [1] puedes ver un guía excelente de la instalación de nusoap sobre CodeIgniter. Básicamente es igual a la instalación del Rest Server: copias la carpeta lib de la instalación de nusoap para la carpeta application/libraries (en mi caso le cambié el nombre a la carpeta lib por nusoap_lib), y en ese mismo nivel creas una biblioteca interfaz que hace una llamada a la nusoap, así:

class Nusoap_library
{
function Nusoap_library()
{
require_once('nusoap_lib/nusoap'.EXT);
}
}

Sencilla de instalar. Ahora vamos a crear servicios: siguiendo el mismo tutorial [1] hacemos un controlador con su constructor, un index y un servicio que suma dos números:

class Soapserver extends CI_Controller
{
function Soapserver()
{
parent::__construct();
$this->load->library("Nusoap_library"); //cargando mi biblioteca
$this->nusoap_server = new soap_server();
$this->nusoap_server->configureWSDL("SOAP Server", $ns);
$this->nusoap_server->wsdl->schemaTargetNamespace = $ns;

//registrando funciones
$input_array = array ('a' => "xsd:string", 'b' => "xsd:string");
$return_array = array ("return" => "xsd:string");
$this->nusoap_server->register('addnumbers', $input_array, $return_array, "urn:SOAPServerWSDL", "urn:".$ns."/addnumbers", "rpc", "encoded", "Addition Of Two Numbers");
}

function index()
{
function addnumbers($a,$b)
{
$c = $a + $b;
return $c;
}

$this->nusoap_server->service(file_get_contents("php://input"));
}
}

Solamente tenemos dos métodos principales, el constructor y el index. En el constructor cargo mi biblioteca que a su vez llama a la nusoap, y configuro el servidor de nusoap. A continuación registro la función addnumbers (debajo del comentario “registrando funciones”). Ese grupo de código dice que la función recibe dos variables strings llamadas a y b, y que retorna otro string. Con $this->nusoap_server->register se registra la función especificando los parámetros de entrada y salida y un conjunto de parámetros que ahora no tienen importancia para este artículo. El último de ellos es un comentario o documentación del servicio addnumbers. Podrás ver que la función se implementa dentro del index, y después de esta función (y de todas las que adiciones) llamas a $this->nusoap_server->service.

Hasta aquí el servidor SOAP debe funcionar sin problemas. Podrás ver tus servicios publicados accediendo a tu sitio http://sitio/index.php/soapserver. Para consumir los mismos prepara otro controlador (por ejemplo soapserver_testing) y un método como este:

function test()
{
$params = array(
'a' => 2,
'b' => 3,
);

$result = $this->nusoap_client->call('addnumbers', $params);
}

Al cual accederías normalmente por el link http://sitio/index.php/soapserver_testing/test.

El problema que nos presenta SOAP sobre REST es que hay que declarar las variables de entrada y salida de cada función, y registrar cada función, lo cual es más pesado pero por supuesto genérico (recuerda que REST formatea cualquier resultado de BD directamente hacia un XML, JSON, etc. sin importar si los valores son enteros, cadenas, etc).

El gran problema con SOAP es a la hora de retornar consultas de la BD que implica la existencia de arreglos, objetos, tipos de datos complejos más allá de los string e int… para esto, debes construir la estructura de los objetos que retornarás. En el siguiente código te pongo un ejemplo completo, por pasos:

1. Creamos una clase que será el resultado del servicio. Utilizando la misma que creé para los servicios REST como te puse en la primera parte de este artículo, sería algo así (fuera de la clase Soapserver):

class Response_students
{
public $responseCode = 100;
public $responseMessage = 'Error desconocido';
public $data = NULL;
}

2. Declaramos un tipo de dato “Student” en el constructor de Soapserver (debajo del comentario “registrando funciones”):

$this->nusoap_server->wsdl->addComplexType(
"Student", //nombre del tipo de dato
"complexType", //tipo complejo
"struct", //en este caso struct por ser un objeto
"all", //no interesante ahora
"", //no interesante ahora
array( //miembros de la clase Student (columnas en la BD)
"NAME"=>array("name"=>"NAME", "type"=>"xsd:string"),
"AGE"=>array("name"=>"AGE", "type"=>"xsd:int")
)
);

3. Creamos un tipo de dato que será un arreglo de “Students”:

$this->nusoap_server->wsdl->addComplexType(
'Students_array',
'complexType',
'array', //tipo array porque es un arreglo de objetos
'',
'SOAP-ENC:Array', //estructura equivalente en SOAP
array(),
array(
array(
'ref' => 'SOAP-ENC:arrayType',
'wsdl:arrayType' => 'tns:Student[]' //contiene un array de Student
)
),
'tns:Student
);

4. Creamos el objeto respuesta de mi servicio, correspondiente a la clase Response_students del paso 1. La clase contiene un código que es un número, un mensaje string, y un objeto de tipo students_array creado en 3, que a su vez es un arreglo de Student creado en 2:

$this->nusoap_server->wsdl->addComplexType(
'Response_students',
'complexType',
'struct',
'all',
'',
array
('responseCode' => array('type' => 'xsd:int'),
'responseMessage' => array('type' => 'xsd:string'),
'data' => array('type' => 'tns: Students_array')
)
);

5. Registramos un método que va a devolver los estudiantes de un aula (class_room):

$this->nusoap_server->register(
"get_students", //nombre de la función
array('class_room' => "xsd:int"), //parámetros de entrada
array("return" => "tns: Response_students"), //objeto de salida
$ns,
$ns . "#get_students",
"rpc",
"encoded",
"Servicio que retorna los estudiantes de un aula"
);

6. Implementamos la función-servicio que retorna los estudiantes, dentro del index:

function get_students($class_room)
{
$CI = &get_instance();
$CI->load->model('students_model');
$students = $CI->students_model->get_students_of_room($class_room);

$result = new Response_students();

if (!empty($students))
{
$result->responseCode = 0;
$result->responseMessage = 'Estudiantes encontrados';
$result->data = array();
foreach ($students as $value)
$result->maintenances_data[] = $value;
}
return $result;
}

Listo. Recuerda que esto no es un tutorial, por eso no he explicado a profundidad todo el código. Basta con que te hayas llevado la idea de cómo es el funcionamiento de la biblioteca nusoap.

Espero que te hayan servido ambas partes del artículo, la relacionada con REST y esta con SOAP. Mi principal conclusión es que realmente hacen honor a los comentarios que te encuentras en internet: con REST implementas rápidamente cualquier servicio y él se encarga de formatearlo a XML u otras estructuras, pero es poco genérico; SOAP es más genérico pero es realmente complicado usarlo para estructuras complejas. De todas maneras, según el sistema que quieras implementar, las bibliotecas que te describí te pueden ser útiles para seguir incorporando funcionalidades a tus sitios implementados sobre CodeIgniter.

Referencias:

[1] SOAP Server In CodeIgniter using NuSOAP PHP Toolkit.htm

http://www.php-guru.in/2013/soap-server-in-codeigniter-using-nusoap-library/

[2] Descarga de biblioteca nusoap:

http://sourceforge.net/projects/nusoap/

{ Leer Más }


martes, 8 de octubre de 2013

Trabajando con Compact Framework 2.0 en el MC9090.

En este post les voy a mostrar una guía de cómo acceder a los servicios publicados en un sitio web mediante dispositivos móviles. Específicamente el dispositivo móvil MC9090 de Motorola, antes Symbol, que corre la versión 2.0 del Compact Framework de .Net y Windows CE (Compact Edition). Aunque este dispositivo lleva ya unos años en el mercado es ideal para entornos industriales como almacenes o pistas de combustibles. Gracias a las características que posee como: lector de códigos de barra, acceso a redes Wi-fi y diseño ergonómico. Además, por supuesto cuenta con la posibilidad de desarrollar aplicaciones personalizadas utilizando .Net.

Entonces nos ponemos en ello, vamos desarrollar una aplicación para este dispositivo que permita consumir los servicios publicados en una web y además utilizar su SDK para comunicarnos con el lector de códigos de barras.

Para nuestro ejemplo consumiremos un servicio de un sitio web publicado bajo la arquitectura RESTful. Les comento que REST (Representational State Transfer) es un estilo de arquitectura para la Web. Los servicios web basados en REST funcionan de manera similar al protocolo HTTP y utilizan los verbos (GET, POST, PUT, DELETE) para acceder a los recursos a través de una URL determinada. Por ejemplo, nuestro servicio utilizara como parámetro el código de barras leído en el dispositivo y de respuesta este devolverá un mensaje de notificación. Acá les muestro una URL de ejemplo para acceder al servicio pasándole el identificador ID5050 de un código de barras leído por el dispositivo:

http://localhost/rest_services/sample/bar_code/ID5050

En este caso se utiliza el verbo GET para acceder al servicio, es por ello que para cada código de barras capturado tendremos una URL diferente.

Antes de comenzar primero algunos detalles de nuestro entorno de desarrollo:

- Microsoft Visual Studio 2008: necesitamos específicamente esta versión porque aunque actualmente existen versiones más modernas de este magnífico IDE solo hasta esta versión nuestros amigos de Microsoft dieron soporte para el desarrollo en Smart Devices.

- EMDK de Motorola para .NET versión 2.8: esta es la SDK específica del proveedor para comunicarnos con las características especiales del dispositivo (ej. lector de código de barras). Incluye bibliotecas, herramientas, ejemplos y una excelente ayuda para facilitarnos nuestro trabajo. http://support.symbol.com/support/product/DEV_SW_TOOLS.html

Una vez que tenemos las herramientas instaladas en nuestra Pc estamos listo para comenzar. Primero creamos un nuevo proyecto de Smart Device en el Visual Studio:

clip_image002clip_image004

Aquí tenemos que cercioramos que seleccionamos la versión correcta de .Net Framework, en este caso 2.0. Luego en la siguiente ventana seleccionamos la plataforma de nuestro dispositivo móvil (Windows CE en nuestro caso), la versión del Compact Framework correspondiente y el tipo de aplicación, como queremos desarrollar una aplicación visual seleccionamos Device Application, y listo.

Primero vamos a acceder al lector de códigos de barras de nuestro equipo. Existen varias formas, aquí les explico la más sencilla e intuitiva con la cual podrán realizar la mayoría de las operaciones con el lector, pero si necesitan obtener más control del lector de código de barras pueden buscar en la ayuda de la EMDK. En este caso vamos a utilizar los DTC (Design Time Components) que nos proporciona la EMDK una vez instalada. Los DTC nos permitirá manejar la mayoría de las funcionalidades del lector de códigos de barras con un simple arrastrar y soltar desde nuestra Barra de Herramientas hacia nuestro formulario, análogo ha como lo hacemos con un botón o un combo box:

clip_image006clip_image008

Una vez con el componente insertado en nuestro formulario, podemos que configurar varias propiedades como los tipos de código de barras a leer y tipo de lector a utilizar. En la mayoría de los casos esta configuración podemos utilizarla por defecto así que en nuestro caso no la modificamos. Lo que si tenemos que hacer es adicionar el evento para manejar la captura del código de barras. Este DTC tiene 2 eventos asociados:

OnScan: Proporciona una notificación a la aplicación cada vez que se presiona el botón disparador del código de barras en el MC9090 y captura un código valido.

OnStatus: Proporciona una notificación a la aplicación cada vez que cambia el estado del lector de código de barras.

En nuestro caso añadimos un evento para cuando se capture el código de barras poder salvarlo y luego enviarlo a nuestro servicio web como parte de la URL:

clip_image010

Es importante tener en cuenta que para poder utilizar el lector de códigos de barras tenemos que habilitarlo en la aplicación como muestra la siguiente línea:

clip_image012

Igualmente justo antes de finalizar la aplicación tenemos que desabilitarlo para que este no cause problemas:

clip_image014

Ahora solo nos falta hacer uso del código de barras obtenido para consumir el servicio web. Si pudiéramos utilizar en este paso WCF (Windows Communication Foundation) prácticamente no tendríamos que hacer nada. Desafortunadamente WCF no está presente en la versión del Compact Framework 2.0 por lo que debemos realizar todo el trabajo por nosotros mismos. Esto se logra de la siguiente manera:

clip_image016

Aquí creamos un objeto de tipo HttpWebRequest, que es la clase de .NET que nos permite acceder a recursos webs a través del protocolo HTTP. Para esto necesitamos especificar la URL del servicio que deseamos consumir. El siguiente paso es especificar el método web que utilizaremos. Es importante aquí destacar como este es establecido mediante un string, siendo lo más lógico siguiendo el paradigma orientado a objeto, que existiera un Enum con todos los métodos web disponibles. Finalmente en la última línea el servicio es consumido y su respuesta almacenada en un objeto de tipo HttpWebResponse.

¿Pero, como accedemos a la información si esta se encuentra almacenada en un flujo de datos? Pues esto se logra de una manera bastante sencilla:

clip_image018

Como ven bastante sencillo. Aquí creamos un XmlReader pasándole el flujo de respuesta, luego obtenemos un XmlDocument a partir del XmlReader creado. En este punto el flujo de datos será transformado en un documento XML. Y voila, ya tenemos almacenado en el XmlDocument la respuesta del servicio, solo es cuestión ahora de pasearla en dependencia de lo que necesitemos leer. Para esto XmlDocument provee las utilidades necesarias. En WCF podríamos establecer mediante contratos el formato de los datos que recibiremos, pero como ya dijimos anteriormente aquí no contamos con esa posibilidad por lo que debemos conocer de antemano la naturaleza de estos. Hemos asumido que la respuesta viene en formato XML, para leer por ejemplo texto plano, como JSON, pueden hacer uso de la clase StreamReader.

Espero que le haya resultado útil el post, cualquier duda puede dejarnos un comentario.

{ Leer Más }


IconIconIcon