Web service con PHP+CI

Hoy me planteo realizar un Web Service o servicio web con PHP y el framework de CodeIgniter.

La idea es la siguiente:

En este enlace se puede ver mi curriculum, que se muestra maquetado para resultar atractivo al visualizarlo en un navegador web. Desde el punto de vista del patrón MVC, el modelo extrae la información de la fuente correspondiente y la vista simplemente maqueta esa información.

El formato que devuelve la vista puede resultar más o menos atractivo, pero es el que es, es que a mí me pareció adecuado cuando diseñé el portal, o el curriculum, o ambas cosas.

Ahora bien, ¿qué hago si quiero tener el curriculum en un formato diferente, digamos como texto, o en XML, o incluso en un formato editable, como Word u ODT? Así, de pronto, se me ocurren tres opciones:

  1. Mantener la información en todos los formatos que necesite, es decir, un dcumento Word, un documento PDF, un documento ODT, un documento HTML… Con esta opción es fáci mantener los formatos, pero cada cambio en la información requiere actualiar todos los documentos y matenerlos actualiados y sincronizados. Es el típico problema de conservar la misma información en distintas fuentes, sin que ninguna de ellas sea el maestro de la información.
  2. Mantener un maetro de la información, y copiar y pegar la información en el formato que se requiera en cada momento. Esto siempre requiere retocar estilos, fuentes, colocación, etc.
  3. Disponer de la información en un formato estándar y, a partir de ahí, una vista en el formato correspondiente maquetará la información. Esto permite mantener un maestro de la información, que sólo ha de ser actualizado y mantenido en un sitio, y una serie de plantillas, cada una en uno de los formatos requeridos, independientes de la información.

La tercera opción es la que menos mantenimiento de la información y del formato requiere. Las plantillas serán cada una en el formato requerido: una plantilla Word, una plantilla PDF, una plantilla ODT y una pantilla HTML, en principio. Y estas plantillas, se alimentan del maestro de la información: un servicio web.

El servicio web

Según Wikipedia, un web service es una tecnología que utiliza un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones. O dicho de otra manera, una aplicación sirve un conjunto de datos que otra aplicación consumirá.

Eso es exactamente lo que voy a hacer, una aplicación que servirá los datos del curriculum para que otra aplicación los consuma.

Primera aproximación: JSON

¿En qué formato devolverá el servicio web la información? Una opción rápida y sencilla es volcar esa informacion en formato JSON. Para ello sólo es necesario generar el modelo correspondiente para obtener la información del cv, y volcarlo desde el controlador en frmato JSON.

load->model( 'cv_model' );
	}
	
	
	/**
	 * Devuelve el cv como servicio web, en formato JSON
	 **/
	function index()
	{
		// Se obtienen los datos a través del modelo.
		$data = $this->cv_model->get();

		// Se devuelven los datos en el formato requerido.
		json_encode( $data );
	}
	
}

/* End of wservice.php */
/* Location: application/controllers/wservice.php */

Consumidor del servicio

Para ver el resultado, montaré un DHTML que se encargue de obtener la información desde el servicio web y mostrarlo en un navegador.

Para ello, el DHTML sólo tiene que cargar los datos desde el servicio web y darle dinamicamente el formato deseado.

El código DHTML podría quedar así:


foto

Fecha de nacimiento:

Dirección:

Teléfono:

Correo:

Web:

Sólo son necesarias algunas funciones en JavaScript para formatear las distintas secciones de la información que devuelve el servicio web. En este caso, se apoyan en jQuery para la selección de los elementos DOM.

var cv;

var callbackCargarDatos = function(json)
{
	// Se decodifican los datos de la ruta.
	cv = jQuery.parseJSON(json);

	mostrarDatosPersonales();
	mostrarSecciones( cv.sections );
	mostrarExperiencias( cv.firms );
	mostrarProyectos( cv.projects );

};

var mostrarDatosPersonales = function()
{
	$('#foto img').attr('src', 'assets/images/' + cv.image);

	$('#datos #nombre').html( cv.name );
	$('#datos #dobirth').html( cv.dobirth );
	$('#datos #address').html( cv.address );
	$('#datos #mobile').html( cv.mobile );
	$('#datos #email').attr('href', 'mailto:' + cv.email ).html(cv.email);
	$('#datos #web').attr('href', cv.web).html( cv.web.replace('http://', '') );

};

var mostrarSecciones = function(sections)
{
	for ( var key in sections )
		mostrarSeccion( sections[ key ] );
};

var mostrarSeccion = function( section )
{
	var html = '
'; html += '

' + section.name + '

'; if ( 'experiencia-laboral' != section.slug && 'proyectos' != section.slug ) { var list = ''; var is_li = false; for (var key in section.paragraphs) { is_li |= ( 1 == section.paragraphs[ key ].is_li ); list += ( 1 == section.paragraphs[ key ].is_li ) ? '
  • ' : '

    '; list += section.paragraphs[ key ].description; list += ( 1 == section.paragraphs[ key ].is_li ) ? '

  • ' : '

    '; } if ( is_li ) html += '
      '; html += list; if ( is_li ) html += '
    '; } html += '
    '; html = $('#contenido').html() + html; $('#contenido').html(html); }; var mostrarExperiencias = function( firms ) { var html = '
      '; for ( var key in firms ) { html += getExperiencia( firms[ key ] ); } html += '
    '; html = $('#experiencia-laboral').html() + html; $('#experiencia-laboral').html(html); }; var getExperiencia = function( firm ) { var html = '
  • '; html += '' + firm.role + '. '; html += firm.name + ' (' + renderDate(firm.begin) + ' - ' + renderDate(firm.end) + ').'; html += '

    ' + firm.description + '

    '; html += '
  • '; return html; }; var mostrarProyectos = function( projects ) { var html = ''; for ( var key in projects ) { html += getProyecto( projects[ key ] ); } html = $('#proyectos').html() + html; $('#proyectos').html(html); }; var getProyecto = function( project ) { var html = ''; html += '

    ' + project.name + '

    '; html += '

    ' + project.roles + ' (' + project.firm + ').'; if ( null != project.client && 'undefined' != project.client) html += ' Cliente: ' + project.client + '.'; html += '

    '; html += '

    ' + project.description + '

    '; html += '

    ' + project.skills + '.

    '; return html; }; var renderDate = function(mysqlDate) { if ( mysqlDate == null || mysqlDate == 'undefined' ) return 'Act.'; // Safari no resuelve hacer new Date("2012-03-24"); otros navegadore sí var t = mysqlDate.split(/[- :]/); var d = new Date(t[0], t[1]-1, t[2], 0, 0, 0); return ("0" + (1 + d.getMonth()) + "/" + d.getFullYear()).substr(-7); };

    En una próxima entrega realizaré un consumidor desde otro ámbito.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *