<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Moodle WebServices</title>
	<atom:link href="http://blogs.dfwikilabs.org/moodle_ws/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.dfwikilabs.org/moodle_ws</link>
	<description>Development Blog about the Moodle Webservices API and interoperability Issues</description>
	<lastBuildDate>Thu, 10 Jul 2008 08:43:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>I want it all: kinds of webservices in moodle.</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/07/10/i-want-it-all-kinds-of-webservices-in-moodle/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/07/10/i-want-it-all-kinds-of-webservices-in-moodle/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 08:42:33 +0000</pubDate>
		<dc:creator>ludo</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Interoperability]]></category>
		<category><![CDATA[Moodle]]></category>
		<category><![CDATA[Webservices]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/07/10/i-want-it-all-kinds-of-webservices-in-moodle/</guid>
		<description><![CDATA[The interoperability for Moodle is a matter of strategic importance. OKTech is doing great things, and in the campus project we did some good job too. But the  goo thing of the proposed architecture that David and Ferran came up with is that allows the posibility of writting connectors implementing many diferent protocols and semantics. [...]]]></description>
			<content:encoded><![CDATA[<p>The interoperability for Moodle is a matter of strategic importance. OKTech is doing great things, and in the campus project we did some good job too. But the  goo thing of the<a href="http://blogs.dfwikilabs.org/moodle_ws/2008/04/14/a-proposal-of-interoperability-architecture-for-moodle/"> proposed architecture</a> that David and Ferran came up with is that allows the posibility of writting connectors implementing many diferent protocols and semantics. So in a near future we will have REST, XML-RPC, SOAP (puaj), <a href="http://www.osoa.org/display/PHP/SCA+with+PHP">OSOA</a>, OKTech, and OKI interfaces for all kinds of happy consumers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/07/10/i-want-it-all-kinds-of-webservices-in-moodle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El significado de la Interoperabilidad</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/05/14/el-significado-de-la-interoperabilidad/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/05/14/el-significado-de-la-interoperabilidad/#comments</comments>
		<pubDate>Wed, 14 May 2008 08:49:56 +0000</pubDate>
		<dc:creator>David Castro García</dc:creator>
				<category><![CDATA[Castellano]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Interoperability]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/05/14/el-significado-de-la-interoperabilidad/</guid>
		<description><![CDATA[ 	 	 	 	 	 	 	 	
Para quizás entender mejor cual es el objetivo de este blog y en definitiva, cual es el sentido de la creación de esta capa de Interoperabilidad para Moodle, deberíamos entender que representa para nosotros la interoperabilidad dentro de Moodle. No sólo por la vertiente de innovación para [...]]]></description>
			<content:encoded><![CDATA[<p> 	 	 	 	 	 	 	 	<!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--></p>
<p align="justify">Para quizás entender mejor cual es el objetivo de este blog y en definitiva, cual es el sentido de la creación de esta capa de Interoperabilidad para Moodle, deberíamos entender que representa para nosotros la interoperabilidad dentro de Moodle. No sólo por la vertiente de innovación para la plataforma, sino también para el sinfín de puertas que podemos abrir.</p>
<p align="justify">La interoperabilidad para las plataforma e-Learning pone de manifiesto la necesidad de intercambiar información, actividades, documentos y en mayor medida, la posibilidad de hacerlo con cursos y usuarios.</p>
<p align="justify">La interoperabilidad supone en lo que respecta al software, la capacidad de los diferentes programas tengan un intercambio de datos a través de un conjunto común de formatos preestablecidos para el  intercambio, leyendo y escribiendo los mismos formatos de archivo, y utilizando los mismos protocolos.</p>
<p align="justify">Esto supone para las aplicaciones informáticas, las aplicaciones web y los sistemas de información sea un requisito principal y esencial para que el flujo de información sea continuo. La información nutre nuestro sistema y evoluciona como producto y por tanto otorga valor añadido a nuestra plataforma e-Learning. De ahí,  la necesidad que el traspaso de información sea lo más transparente posible y lo más versátil. Proveyendo a la plataforma de un nuevo nivel de negocio, donde ya no sólo la usabilidad y la facilidad de aprendizaje sean primordiales, sino  que los contenidos sean adecuados y fácilmente ampliables, contrastables y portables.</p>
<p align="justify">Ya que las ventajas de tener un sistema de enseñanza y aprendizaje integrado y basado en estándares interoperables son muchas puesto que pueden permitir, tener repositorios de bibliotecas externos para mantener el material de la formación académica en un sólo deposito, la facilidad de uso para la construcción de herramientas pedagógicas, poder combinar los contenidos, de tal forma que sean reusables y permitan ser personalizados en un nuevo contexto, etc.</p>
<p align="justify">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/05/14/el-significado-de-la-interoperabilidad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Problemas con nuSOAP y PHP5</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/05/07/problemas-con-nusoap-y-php5/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/05/07/problemas-con-nusoap-y-php5/#comments</comments>
		<pubDate>Wed, 07 May 2008 14:11:48 +0000</pubDate>
		<dc:creator>Ferran Recio Calderó</dc:creator>
				<category><![CDATA[Castellano]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Interoperability]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[NuSOAP]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Technic]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/05/07/problemas-con-nusoap-y-php5/</guid>
		<description><![CDATA[NuSOAP es un proyecto Open Source que permite conexiones SOAP mediante PHP de forma fácil. Desde las últimas versiones, Moodle incorpora ésta librería para la Moodle Network y es una parte imprescindible de los Webservices.
Durante el proceso programación de los conectores nos hemos encontrado con que el NuSOAP que viene dentro de Moodle no funciona [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://dietrich.ganx4.com/nusoap/">NuSOAP</a> es un proyecto Open Source que permite conexiones <a href="http://es.wikipedia.org/wiki/SOAP">SOAP</a> mediante PHP de forma fácil. Desde las últimas versiones, Moodle incorpora ésta librería para la Moodle Network y es una parte imprescindible de los Webservices.</p>
<p>Durante el proceso programación de los conectores nos hemos encontrado con que el <a href="http://dietrich.ganx4.com/nusoap/">NuSOAP</a> que viene dentro de Moodle no funciona correctamente con PHP5 en algunos niveles de debugación.<span id="more-25"></span></p>
<p>Todos estos errores  se deben a que PHP5 es bastante más restrictivo con lo tipos de datos que PHP4 (recordemos Moodle 2.0 será el primero que exigirá PHP5). De hecho, dos de los tres cambios consisten simplemente en eliminar una concatenación de String+Array en una variable de debugación interna de NuSOAP.</p>
<p>Todos los cambios afectan al archivo <strong>&#8220;/lib/soap/nusoap.php&#8221;</strong> dentro de la raíz de Moodle.</p>
<h3>Primer Cambio</h3>
<p>La primera corrección consiste en comprobar el tipo de dato antes de operar con él. Para ello se añadirá código encima de la <strong>línea 3609</strong>. El contenido original es el siguiente (la línea especificada está en <em>cursiva</em>):</p>
<p><font color="#993300">&#8230;$call_arg = array(&amp;$instance, $method);<br />
}<br />
<em>$this-&gt;methodreturn = call_user_func_array($call_arg, array_values($this-&gt;methodparams));</em><br />
}<br />
$this-&gt;debug(&#8217;in invoke_method, methodreturn:&#8217;);&#8230;</font></p>
<p>La línea a añadir es:</p>
<p><font color="#008000">if (!is_array($this-&gt;methodparams)) $this-&gt;methodparams = array($this-&gt;methodparams);</font></p>
<p>Y el código queda:</p>
<p><font color="#008000">&#8230;$call_arg = array(&amp;$instance, $method);<br />
}<br />
if (!is_array($this-&gt;methodparams)) $this-&gt;methodparams = array($this-&gt;methodparams);<br />
<em>$this-&gt;methodreturn = call_user_func_array($call_arg, array_values($this-&gt;methodparams));</em><br />
}<br />
$this-&gt;debug(&#8217;in invoke_method, methodreturn:&#8217;);&#8230;</font></p>
<h3>Segundo Cambio</h3>
<p>El segundo se encuentra en la <strong>línia 3613</strong> del código original. El cambio simplemente es quitar una concatenación del debug de <a href="http://dietrich.ganx4.com/nusoap/">NuSOAP</a>. El original es (la parte a eliminar está en <strike>rallada</strike>):</p>
<p><font color="#993300">&#8230;$this-&gt;debug(&#8217;in invoke_method, methodreturn:&#8217;);<br />
$this-&gt;appendDebug($this-&gt;varDump($this-&gt;methodreturn));<br />
$this-&gt;debug(&#8221;in invoke_method, called method $this-&gt;methodname, received <strike>$this-&gt;methodreturn</strike> of type &#8220;.gettype($this-&gt;methodreturn));&#8230;</font></p>
<p>Y el código queda:</p>
<p><font color="#008000">&#8230;$this-&gt;debug(&#8217;in invoke_method, methodreturn:&#8217;);<br />
$this-&gt;appendDebug($this-&gt;varDump($this-&gt;methodreturn));<br />
$this-&gt;debug(&#8221;in invoke_method, called method $this-&gt;methodname, received of type &#8220;.gettype($this-&gt;methodreturn));&#8230;</font></p>
<h3>Tercer Cambio</h3>
<p>El tercer cambio es idéntico al anterior pero en la <strong>línea 5414</strong>, donde el código original es (la parte a eliminar está en <strike>rallado</strike>):</p>
<p><font color="#993300">&#8230;$contents = &#8221;;<br />
foreach($value as $k =&gt; $v) {<br />
$this-&gt;debug(&#8221;serializing array element: $k<strike>, $v of type: $typeDef[arrayType]</strike>&#8220;);<br />
//if (strpos($typeDef['arrayType'], &#8216;:&#8217;) ) {<br />
if (!in_array(&#8230;</font></p>
<p>Donde el resultante es:</p>
<p><font color="#008000">&#8230;$contents = &#8221;;<br />
foreach($value as $k =&gt; $v) {<br />
$this-&gt;debug(&#8221;serializing array element: $k&#8221;);<br />
//if (strpos($typeDef['arrayType'], &#8216;:&#8217;) ) {<br />
if (!in_array(&#8230;</font></p>
<p>Con estos tres cambios nos ha sido posible conectar los servicios de prueba que ya están implementados con un programa en pyhton 2.5. Sin embargo, es muy posible que los errores en el String de debug se repitan en otras partes del código.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/05/07/problemas-con-nusoap-y-php5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>API, servicios y paquetes</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/05/02/api-servicios-y-paquetes/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/05/02/api-servicios-y-paquetes/#comments</comments>
		<pubDate>Fri, 02 May 2008 16:57:10 +0000</pubDate>
		<dc:creator>Ferran Recio Calderó</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Castellano]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Technic]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/05/02/api-servicios-y-paquetes/</guid>
		<description><![CDATA[Como ya se comentó en el porqué de los webservices en Moodle, los webservices permiten que un cliente se conecte a Moodle y pueda acceder a un conjunto de funciones públicas de la API.
La arquitectura en tres capas garantiza que las funciones que conforman la API puedan ampliarse independientemente de los conectores. De hecho, pese [...]]]></description>
			<content:encoded><![CDATA[<p>Como ya se comentó en <a href="http://blogs.dfwikilabs.org/moodle_ws/2008/04/12/why-webservices-in-moodle/">el porqué de los webservices en Moodle</a>, los webservices permiten que un cliente se conecte a Moodle y pueda acceder a un conjunto de funciones públicas de la <em>API</em>.</p>
<p>La arquitectura en tres capas garantiza que las funciones que conforman la <em>API </em>puedan ampliarse independientemente de los <em>conectores</em>. De hecho, pese a que en un inicio hemos empezado por la implementación de las funciones de gestión académica que requiere la comunidad de Moodle (el paquete básico), está previsto que se amplíe con los servicios de los módulos (fòrum, wiki, recursos), bloques, desarrollos a medida&#8230;</p>
<p>Así, con el tiempo la <em>API </em>se completará con un número variable de funciones que, en muchos casos, cubrirán necesidades alternativas a la gestión académica (interfaces adaptadas, acceso desde móvil, monitorización remota&#8230;). Por éste motivo, a medida que la <em>API </em>crece, las funciones se agrupan en <em>servicios</em>, para que el cliente elija cuales necesita.<span id="more-24"></span></p>
<p>Por ejemplo, las funciones de control de usuarios formarían parte del <em>servicio </em>&#8220;user&#8221;, mientras que el de acceso a los mensajes de los foros podría ser el <em>servicio </em>&#8220;forum&#8221; .</p>
<p>Sin embargo, esta estructura sólo nos garantiza un único nivel de <em>servicios</em>, identificados por nombre. En caso que una organización quiera añadir más, deberán añadirse en el mismo sitio. Y si un cliente necesita, por ejemplo, todos los <em>servicios </em>de los módulos tendrá que pedirlos uno a uno, dado que el webservice no puede diferenciar qué <em>servicios </em>son de los módulos y cuáles no.</p>
<p>Por éste motivo los <em>servicios </em>de agrupan en <em>paquetes </em>(Fig 1). El sistema de paquetización es muy común en los lenguajes de programación estructurados como Python. En el caso de la <em>API</em>, todos los servicios pertenecen a un único <em>paquete </em>o al <em>paquete básico</em> (que se incluye siempre por defecto y contiene las funciones básicas de navegación, login&#8230;).</p>
<p>En los ejemplos anteriores, la gestión de usuarios estaría dentro del <em>paquete básico</em>, por lo que se llamaría &#8220;user&#8221; sin más, y el <em>servicio </em>de los foros estaría dentro del <em>paquete </em>&#8220;mod&#8221;, por lo que sería &#8220;mod.forum&#8221;.</p>
<p><a href="http://www.flickr.com/photos/davfer/2459004015/" title="packages by ferran.david, on Flickr"><img src="http://farm3.static.flickr.com/2390/2459004015_ca34a3756c.jpg" alt="packages" height="290" width="500" /></a></p>
<p align="center"><em>Fig.1 Diagrama de la paquetización</em></p>
<p>Gracias al sistema de paquetización es possible:</p>
<ul>
<li>Programar varios <em>servicios </em>a medida y agruparlos en un único <em>paquete </em>de modo que sea menos intrusivo en el sistema.</li>
<li>Mantener ordenadas las librerías de <em>servicio </em>que conforman un <em>paquete</em>.</li>
<li>Cada cliente podrá requerir  un <em>servicio </em>concreto (por ejemplo el <em>servicio </em>&#8220;mod.forum&#8221;) o todos los <em>servicios </em>de un <em>paquete </em>(por ejemplo, &#8220;mod.*&#8221; incluye todos los <em>servicios </em>del <em>paquete </em>&#8220;mod&#8221;).</li>
<li>A nivel de Moodle, será posible conectar y desconectar los <em>servicio </em>que se ofrecen a los clientes, tanto a nivel individual como de <em>paquete</em>.</li>
</ul>
<p>A modo de resumen, la <em>API </em>del <em>webservice </em>es el conjunto de <em>servicios </em>que están disponibles dentro de los <em>paquetes</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/05/02/api-servicios-y-paquetes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Requerimientos y limitaciones en las funciones de la API</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/requerimientos-y-limitaciones-en-las-funciones-de-la-api/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/requerimientos-y-limitaciones-en-las-funciones-de-la-api/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 11:13:36 +0000</pubDate>
		<dc:creator>Ferran Recio Calderó</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Castellano]]></category>
		<category><![CDATA[Interoperability]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Technic]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/requerimientos-y-limitaciones-en-las-funciones-de-la-api/</guid>
		<description><![CDATA[Cuando se empieza una API de estas características es muy importante definir bien las líneas generales antes de empezar. En nuestro caso pretendemos crear una capa que nos permita acceder a Moodle de forma centralizada. Normalmente, ésto se realizaría usando directamente la funciones de Moodle, sin embargo existen algunos requerimientos adicionales para las funciones que [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando se empieza una API de estas características es muy importante definir bien las líneas generales antes de empezar. En nuestro caso pretendemos crear una capa que nos permita acceder a Moodle de forma centralizada. Normalmente, ésto se realizaría usando directamente la funciones de Moodle, sin embargo existen algunos requerimientos adicionales para las funciones que se deben tener en cuenta:<span id="more-9"></span></p>
<ul>
<li>Las funciones deben ser suficientemente simples para que pueda ser usada por lenguajes de programación simplificados (J2ME, C# Mobile, Javascipt&#8230;) y dispositivos limitados (móviles, reproductores de MP3&#8230;).</li>
<li>Las funciones deben ser genéricas para que sirvan de soporte a aplicaciones de alto nivel (gestiones académicas, interfaces de usuario alternativas&#8230;) y den acceso a todas las funcionalidades del sistema.</li>
<li>Los datos se tienen que poder usar en cualquier lenguaje de programación estructurado. Pero, a su vez, tienen que ser útiles y servir para minimizar el número de llamadas a la funciones.</li>
<li>El resultado de las funciones debe ser útil, completo y mínimo. Los resultados complejos deben contener aquello que se necesita, sin devolver datos superfluos o poco usados pero sin obligar a que el cliente realice llamadas extras para conseguir más información básica.</li>
<li>Las estructuras de datos serán reusables y su número finito. Se debe evitar que existan más de dos estructuras para representar un mismo concepto.</li>
<li>Se debe garantizar el acceso a la API mediante varios tipos de conexión externa (SOAP, JSON&#8230;) y también mediante la inclusión directa en PHP desde el propio sistema.</li>
<li>Las funciones de la API tienen que basarse <a href="http://tracker.moodle.org/browse/MDL-12886">en las propuestas por Moodle</a>.</li>
</ul>
<p>Todas éstas limitaciones nos obligan a replantearnos muchas de las funciones de Moodle. Sin embargo, ésto es un aspecto positivo del proyecto, que nos brinda la posibilidad de ver Moodle desde un nuevo punto de vista y dar coherencia a todas partes del código.</p>
<h3>Definición de los casos</h3>
<p>Para cumplir los requerimientos y, al mismo tiempo, cubrir las necesidades de Moodle, hemos decidido diferenciar dos casos:</p>
<ul>
<li>La conexión directa desde PHP (en el mismo servidor)</li>
<li>Cualquier método de conexión remota (SOAP, XML, Json&#8230;)</li>
</ul>
<p>Pese a que ambos casos usarán las mismas funciones, cuando la llamada se realice desde conexión directa se permitirá más libertad en el paso de parámetros. El motivo es muy simple, PHP es un lenguaje interpretado que deja manga ancha a los programadores: parámetros optativos, tipos de datos no declarados explícitamente&#8230; en cambio, los protocolos de interconexión como SOAP están pensados para lenguajes más restrictivos como Java y, en consecuencia, no permiten muchos de los informalismos de PHP.</p>
<h3>Limitaciones en la conexiones remotas</h3>
<p>En principio las conexiones remotas deben permitir el acceso a la API mediante cualquier protocolo. Sin embargo, existe un par de condiciones que de deben cumplir en pos de conseguir una API eficiente:</p>
<ul>
<li>Orientación a objetos, o que pueda trabajar con datos estructurados como estructuras y matrices (&#8221;Structs&#8221; y &#8220;Arrays&#8221;).</li>
<li>Que permita que el resultado de las funciones sean estructuras complejas; vectores, estructuras o vectores de estructuras.</li>
</ul>
<p>Una vez cribados los protocolos, toca fijarnos en las limitaciones que se impondrán en las llamadas remotas. Para ello debemos fijarnos en aquellos protocolos y lenguajes estructurados que menos flexibilidad dejan al programador. Podemos decir que se va a mínimos, pero siempre teniendo en cuenta que las siguientes limitaciones sólo se aplican a las conexiones remotas, no a la directa en PHP.</p>
<p><strong>Punto remoto 0: declaración de las funciones</strong></p>
<p>En PHP las variables y funciones no se declaran. De echo, cuando se incluye un archivo de código, se puede suponer que se tiene acceso a todas la funciones y que los parámetros pueden pasarse sin necesidad de especificar el tipo.</p>
<p>Por desgracia, no ocurre los mismo con la mayoría de los lenguajes, donde es necesario declarar las funciones (los &#8220;.h&#8221; de c, por ejemplo) y los parámetros van asociados a un tipo (en Java, &#8220;int&#8221;, &#8220;boolean&#8221;&#8230;). De hecho, todos los protocolos de llamada remota requieren que las funciones invocables estén declaradas y los tipos especificados.</p>
<p>Por éste motivo, cada servicio dispondrá de una función especial llamada &#8220;mdl_nombreservicio_info&#8221; (a partir de ahora la llamaremos función &#8220;info&#8221;) donde las funciones públicas estarán declaradas mediante una estructura de datos. Ésta primera limitación es tan importante que se detallará en próximos artículos.</p>
<p><strong>Punto remoto 1: un único tipo por parámetro</strong></p>
<p>Cada parámetro de las funciones sólo podrá ser de un tipo de dato. Pese a que en algunos lenguajes de alto nivel es común que no sea así (por ejemplo que un parámetro pueda ser un entero para tratar un único identificador o un vector para tratar un conjunto) sería erróneo generalizar y, por tanto, es obligatorio especificar un único tipo en la función &#8220;info&#8221;.</p>
<p><strong>Punto remoto 2: todos los parámetros son obligatorios</strong></p>
<p>Los parámetros optativos son bastante habituales en los lenguajes interpretados (Python, Perl, PHP&#8230;) y otros usan polimorfismo para simularlos (Java, C#&#8230;), sin embargo el resto no disponen de ésta posibilidad, así que todos los parámetros que se especifiquen la función &#8220;info&#8221; deben ser obligatorios.</p>
<p><strong>Punto remoto 3: limitaciones en los tipos de datos complejos</strong></p>
<p>pese a que en la función &#8220;info&#8221; se puedan declaras tipos de datos complejos, sólo se permiten:</p>
<ul>
<li> vectores (&#8221;arrays&#8221;) de elementos simples (enteros, booleanos, cadenas&#8230;)</li>
<li>estructuras (&#8221;structs&#8221;) de elementos simples</li>
<li>vectores de estructuras</li>
</ul>
<p>Por ejemplo, serían válidos:</p>
<ul>
<li>un vector de enteros</li>
<li>una estructura llamada <em>persona</em> formada por una cadena de caracteres <em>nombre</em> (&#8221;String&#8221;) y un entero <em>zapato</em> con el número de zapato.</li>
<li>un vector donde cada elemento es de tipo <em>persona</em>.</li>
</ul>
<p>Y NO serían válidos (los errores están <strike>rallados</strike>):</p>
<ul>
<li>una estructura <em>familia</em> formada por la cadena <em>dirección</em> y <strike>un vector donde los elementos son de tipos <em>persona</em></strike> y que se llama <em>miembros</em>. (No se permite que una estructura contenga un vector)</li>
<li>un vector donde cada elemento contiene <strike>un entero y un booleano</strike> (La solución seria declarar una estructura M con un entero y un booleano y que los elementos del vector fuesen de tipo M).</li>
<li>una estructura llamada <em>principal</em> que contenga un entero llamado <em>simpatía</em> y una estructura de tipo <em>persona</em> llamada <em>sujeto</em> (No se permite que una estructura contenga otra estructura).</li>
</ul>
<p>El motivo de ésta limitación es garantizar que la mayoría de los protocolos se podrán conectar a la API sin problemas. Si se permitieran estructuras dentro de estructuras la penalización de la serialización y deserialización recursiva de las variables podría llegar a ser excesiva.<br />
<strong>Punto remoto 4: evitar los parámetros complejos</strong></p>
<p>Podemos suponer que todos los clientes potenciales de los webservices podrán usar parámetros complejos en las llamadas pero, como norma general, a costa de complicar el código. En consecuencia, se intentarán evitar en la medida de los posible.</p>
<p>En caso que no sea posible, es recomendable que los parámetros complejos sólo sean vectores de tipos simples (enteros, booleanos&#8230;). Por parte del cliente, montar un vector simple no supone un gran coste, sin embargo, montar una estructura con una especificación remota (por ejemplo si están definidas en el WSDL de SOAP, y no en el cliente) puede ser complicado y puede generar más acoplamiento del necesario.</p>
<p>Ésta recomendación sólo se aplicará a los parámetros, pero no a los resultados (o retornos). Si se intenta que todos los resultados sean simples, lo más probable es que se acaben codificando funciones incompletas que requieran de más llamadas por parte del cliente. Así que no hay ningún problema en devolver resultados complejos siempre que cumplan el <em>punto remoto 3</em> y que se declaren en la función &#8220;info&#8221;.</p>
<p><strong>Punto remoto 5: un único resultado y siempre del mismo tipo</strong></p>
<p>Son muy pocos los lenguajes donde el tipo de dato del retorno puede variar arbitrariamente (por ejemplo devolver un objeto complejo o un identificador entero según se necesite) y muchos menos los que permiten que las funciones devuelvan más de un resultado.</p>
<p>Sin duda, sería un error que la API fuese permisiva en éste aspecto, así que todas las funciones tendrán un máximo de un retorno y su tipo siempre será el mismo (que será especificado en la función &#8220;info&#8221;). Además, pese a que no es obligatorio que las funciones devuelvan algo, seria recomendable que así fuese.</p>
<h3>Limitaciones en la conexión directa PHP</h3>
<p>Técnicamente, no existe ninguna limitación para que las funciones de la API no sean parecidas a las internas de Moodle. Sin embargo, todas las funciones deben ser invocables también desde las conexiones remotas, así que es conveniente tomar ciertas precauciones:</p>
<p><strong>Punto directo 1: se permiten los parámetros optativos</strong></p>
<p>Pese a que en las conexiones remotas no se permiten los parámetros optativos por limitaciones técnicas (<em>punto remoto 2</em>), prohibirlo en la conexión directa PHP sería limitar mucho el trabajo de los programadores y, en consecuencia, está permitido usar valores por defecto en los parámetros de las funciones.</p>
<p>En cualquier caso se debe asegurar que, como mínimo, aquellos parámetros que no tengan un valor por defecto estarán especificados en la función &#8220;info&#8221;. Es decir, en caso que en conexión directa se permita llamar a la función con más parámetros (algunos de ellos optativos), los obligatorios deben aparecer en la función &#8220;info&#8221;. Igualmente, cuando en conexión directa se permitan menos parámetros (por ejemplo porqué algunos valores se recogen de la sesión en caso que no se especifiquen), los optativos restantes también aparecerán &#8220;info&#8221;.</p>
<p><strong>Punto directo 2: el retorno será siempre del mismo tipo </strong></p>
<p>Como se ha explicado en las conexiones remotas, los retornos de una función serán siempre del mismo tipo (<em>punto remoto 5</em>) y tendrán limitaciones (<em>punto remoto 3)</em>. Ésto también afecta la conexión PHP, donde será obligatorio.</p>
<p>Pese a que pueda parecer un planteamiento extremo, es importante que se cumpla ésta limitación. Si se permitiera devolver resultados distintos cuando se ejecuta en conexión directa o remota, estaríamos creando acomplamiento entre los conectores y la API porqué algunas partes de código serían específicas dependiendo de la conexión. Con ésta limitación se evita.</p>
<p>A primera vista se podría pensar que el parágrafo anterior se contradice con el <em>punto directo 1</em>. Sin embargo, si analizamos más a fondo, podemos ver que el <em>punto directo 1</em> sólo explota los parámetros optativos de PHP y no crea acoplamiento alguno, dado que no funciona distinto según el tipo de conexión. De éste modo, si en un futuro se implementa un nuevo tipo de conector que permita parámetros optativos, el código no se modificaría en absoluto.</p>
<p><strong>Punto directo 3: comprobaciones de tipo de dato en los parámetros</strong></p>
<p>Para mantener las especificaciones impuestas por Moodle, es necesario permitir que los tipos de dato de los parámetros puedan ser distintos según interese (por ejemplo, pasar un entero para tratar un único elemento o vector para realizar un tratamiento masivo). Éste uso de las variables es común en PHP, sin embargo la mayoría de los lenguajes no lo soportan.</p>
<p>Sin duda, permitir ésto provoca un cierto grado de acoplamiento entre la API i los conectores. Por éste motivo es IMPRESCINDIBLE que la comprobación de tipos no provoque replicación de código, dado que ésto sólo limitaría la escalabilidad de la arquitectura.</p>
<p>Por ejemplo, supongamos que tenemos la función &#8220;mdl_user_get_users($userids)&#8221; donde el parámetro puede ser un simple entero para conseguir un usuario, o un vector de enteros para conseguir varios:</p>
<p>En éste caso el código se puede plantear de dos formas: suponiendo inicialmente que $userids es un vector o, por el contrario, un único entero. Pese a que las dos funciones serían parecidas y ambas cumplirían las especificaciones, la segunda opción requiere replicación y, por tanto, NO sería válida para la API.</p>
<p>Opción A:  suponiendo que es un vector, correcta para la API:</p>
<pre>function mdl_user_gest_users ($userids) {</pre>
<pre> if (!is_array($userid)) $userids = array($userids);</pre>
<pre> $res = array();</pre>
<pre> foreach ($userids as $userid) {</pre>
<pre>   (... conseguir el usuario y ponerlo en res ...)</pre>
<pre> }</pre>
<pre> return $res;</pre>
<pre>}</pre>
<p>Opción B: suponiendo que es un entero, inválida para la API (la parte replicada está <strike>rallada</strike>):</p>
<pre>function mdl_user_gest_users ($userids) {</pre>
<pre> $res = array();</pre>
<pre> if (!is_numeric($userid)) {</pre>
<pre>   <strike>(... buscar el usuario y ponerlo en res ...)</strike></pre>
<pre> } else {</pre>
<pre>   foreach ($userids as $userid) {</pre>
<pre>     <strike>(... conseguir el usuario y ponerlo en res ...) </strike></pre>
<pre>   }</pre>
<pre> }</pre>
<pre> return $res;</pre>
<pre>}</pre>
<p>Se permitimos que se replique código en las funciones, a la larga sería imposible mantener los dos códigos actualizados y la posibilidad de cometer errores de copia y pegar (&#8221;cut and paste&#8221;) aumentaría dramáticamente. Por éste motivo es prioritario que se cumpla esté punto y, en caso que no sea posible, se debe evitar el uso de parámetros con tipos variables.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/requerimientos-y-limitaciones-en-las-funciones-de-la-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jordi Piguillem gets a Google SOC to implement IMS TI on Moodle</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/jordi-piguillem-gets-a-google-soc-to-implement-ims-ti-on-moodle/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/jordi-piguillem-gets-a-google-soc-to-implement-ims-ti-on-moodle/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 06:56:20 +0000</pubDate>
		<dc:creator>ludo</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[IMS TI 2.0]]></category>
		<category><![CDATA[DFWikiteam]]></category>
		<category><![CDATA[Pigui]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/jordi-piguillem-gets-a-google-soc-to-implement-ims-ti-on-moodle/</guid>
		<description><![CDATA[
Our Local Hero Jordi Piguillem has got a Google Summer of Code scollarship.   Chuck Severance will mentor him, and I will do my best. The proposed task for Pigui&#8217;s  SOC  will be to implement IMS TI 2.0 in Moodle. In the UPC we did something similar for the Campus project, inspired by Chuck&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://appserv.lsi.upc.es/palangana/moodle/file.php/15/pigui_ag_ru.JPG"><img src="http://appserv.lsi.upc.es/palangana/moodle/file.php/15/pigui_ag_ru.JPG" border="0" /></a></p>
<p>Our Local Hero Jordi Piguillem has got a Google Summer of Code scollarship.   <a href="http://dr-chuck.com/">Chuck Severance</a> will mentor him, and I will do my best. The proposed task for Pigui&#8217;s  SOC  will be to implement IMS TI 2.0 in Moodle. In the UPC we did something similar for the Campus project, inspired by Chuck&#8217;s explanations about IMS TI 1.0 and the requirements for the OKI &#8211; Gateway. This project and the DFWebservices are very related.</p>
<p>Congratulations Pigui.  Read more in Pigui&#8217;s Blog:  <a href="http://blogs.dfwikilabs.org/pigui">Moodle Happens</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/04/22/jordi-piguillem-gets-a-google-soc-to-implement-ims-ti-on-moodle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A proposal of interoperability architecture for Moodle</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/04/14/a-proposal-of-interoperability-architecture-for-moodle/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/04/14/a-proposal-of-interoperability-architecture-for-moodle/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 16:21:05 +0000</pubDate>
		<dc:creator>ludo</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Interoperability]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Moodle]]></category>
		<category><![CDATA[Webservices]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/04/14/a-proposal-of-interoperability-architecture-for-moodle/</guid>
		<description><![CDATA[Designing a Webservices Architecture for Moodle: Moodle-DFWs.

The purpose of this entry is to analyze the interoperability needs of Moode, and to make a proposal of architecture (that is already partially implemented). We call this Moodle-DFWs, because it needs a name. All this work is being done in the Universitat Politecnica de Catalunya by the group [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Designing a Webservices Architecture for Moodle: Moodle-DFWs.<br />
</strong><br />
The purpose of this entry is to analyze the interoperability needs of Moode, and to make a proposal of architecture (that is already partially implemented). We call this Moodle-DFWs, because it needs a name. All this work is being done in the <a href="http://www.upc.edu">Universitat Politecnica de Catalunya</a> by the group known as <strong>DFWikiteam</strong>.</p>
<p><strong>Antecedents.</strong></p>
<p>Martin Dougiamas assigned to us the task of developing a API to access the services of the Moodle core (Let’s call it THE API from now on). This task is d<a href="http://tracker.moodle.org/browse/MDL-12886">escribed in the Moodle tracker </a> and in<a href="http://docs.moodle.org/en/Development:Web_services"> Moodle Docs</a>. It consists on a set of PHP functions that encapsulate most of the services that an external ( and even internal ) application shall need from a <strong>Moodle </strong>server. For example a backoffice application to manage inscriptions and billing.  This API consists in a number of functions already proposed by <strong>Martin</strong> and other guys at Moodle.org  and this development will help to redesign some of the very Moodle core functions in the future.</p>
<p>This will be useful for all developers who want to develop applications for <strong>Moodle</strong>, because this development can lead to a documented and stable <strong>API</strong> to hack into <strong>Moodle</strong> that should overcome new versions of <strong>Moodle</strong>. With funding we could even backport the API&#8230; anyone interested }-)</p>
<p>OK, e are doing this. But we are not going to stop there. Our intentions are more mean. We intend to provide an interoperability architecture to be built over this API.  Some of the functions of <strong>THE API</strong> <a href="http://cvs.moodle.org/contrib/patches/dfws/">are already in the CVS</a>  and we are gaining speed writing them. <img src='http://blogs.dfwikilabs.org/moodle_ws/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>Requirements  </strong></p>
<p><strong>Moodle-DFWs</strong> needs to be accessible using any transport protocol present or future. So it cannot depend on a concrete Webservices protocol, name it XML-RCP, SOAP, REST or two empty yogurt vases tied by a wire.<br />
<strong>Moodle-DFWs</strong> will need to be implemented in the present version of Moodle (Moodle 1.9) and in the future versions as well. We take for granted that in the future more services will come up, but &#8211; come on guys &#8211; we need the semantics of the first release to remain stable. We don’t want it to be like a regular Java with lots of deprecated features&#8230;. we remember: “<em>Java is evil and eats kids</em>”&#8230; said the master.<br />
<strong>Moodle-DFWs </strong>needs to be extendable, so contrib amb custom applications can have a standard way to extend <strong>Moodle</strong> out of its bounds. To ensure security and simplify administration: Moodle-DFWs has to obey the Moodle Capabilities system.</p>
<p><strong>A first glimpse at Moodle-DFWs</strong></p>
<p>Lets look at fig.1. In this figure we have Moodle (in an orange box, off course), just below Moodle we have blue boxes that represent Moodle extensions such activity modules, courses or blocks. The purple lines plug all these software artifacts with a green box labeled API. This is THE API that MD wants us to develop. At least the part that talks with the orange Moodle box.</p>
<p>We want to propose a way to extend THE API so MOD, BLOCK, and COURSE extensions can provide their own service through THE API. These extensions would be dynamically included in the API if the Moodle Admin allows it. So here’s the first thing to debate. There are scalability and security issues at stake&#8230; so we want to hear from Martin Langhoff and Petr Skodak soon (we hope he will like these more than the wiki <img src='http://blogs.dfwikilabs.org/moodle_ws/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
<p><a href="http://www.flickr.com/photos/davfer/2403140336/" title="Moodle Webservice architecture diagram by ferran.david, on Flickr"></p>
<p><img src="http://farm4.static.flickr.com/3271/2403140336_0839b85078.jpg" alt="Moodle Webservice architecture diagram" height="434" width="500" /></p>
<p></a></p>
<p align="center"><em>Fig. 1 A firs glimpse on the Moodle-DFWs architecture.</em></p>
<p>There’s also a CON green box, just over THE API. We took this box out of THE API because is something you will only need when using a connection from another application. If you access THE API directly from a inside Moodle PHP application, an activity module for example, you just don’t need it. The CON box contains the methods to authenticate authorize the remote application. These remote applications will talk with the blue boxes inside the big green box on the left (still on fig 1). We call these boxes <strong>Connectors</strong>, and those are who implement a way of connection, giving us independence of the webservices protocol.</p>
<p>We have already released to the tracker one connector for PHP and another for SOAP. To test the SOAP connector Ferran Wrote a Python client, also in the CVS.</p>
<p>This architecture allows that the services implemented in the connectors can be independent of the methods of THE API they use. Security enhancements and scalability considerations can be applied in the design of custom connectors. In fact a connector does not need to implement a full access to the Moodle Services, juts what the organization needs. In this case the Moodle partners could meet a new field of business making custom, secure and high performance connectors. (I just have the feeling that MNET could be re-implemented as a connector some day (comments from my friend Martin Lanhoff are required!))</p>
<p>The current design of the connectors requires them to implement two basic components.</p>
<ul>
<li><strong>Connect:</strong> initiates the first connection with Moodle. Login and logout will be handled here, and will negotiate the services from THE API that will be accessed. To manage remote connections  “connect” will be the address for the http/s session.</li>
<li><strong>InOut:</strong> is the one who offers the client application the services implemented in the connector according to the rights of the authenticated user.</li>
</ul>
<p><strong>A three layered architecture.<br />
</strong><br />
So, we get this tree layers (See Fig. 2):</p>
<ul>
<li><strong>Connect Layer:</strong> Contains the connectors that implement services to local(PHP) or remote (Webservices) applications. Each component manifests the services implemented using the “info” function, and implement the Connect and InOut components.</li>
<li><strong>Integration layer:</strong>  This layer consists on THE API (being implemented) that provides a one point access to the Moodle + contrib functionalities.</li>
<li><strong>Services Layer:</strong> Is where real things happen. THE API knows ho to deal with the Moodle core, and in future posts we will deal on how the activity modules, course formats and plugins can offer their services to the clients.</li>
</ul>
<p><a href="http://www.flickr.com/photos/davfer/2403150142/" title="layers by ferran.david, on Flickr"></p>
<p><img src="http://farm3.static.flickr.com/2164/2403150142_05d80d3f1c.jpg" alt="layers" height="347" width="500" /></p>
<p>Fig 2: 3 Layers are cool</p>
<p>&nbsp;</p>
<p></a><br />
That&#8217;s It&#8230; comments and serrano ham are most wellcome!<br />
DFWikiteam</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/04/14/a-proposal-of-interoperability-architecture-for-moodle/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Why Webservices in Moodle?</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/04/12/why-webservices-in-moodle/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/04/12/why-webservices-in-moodle/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 18:59:48 +0000</pubDate>
		<dc:creator>ludo</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Interoperability]]></category>
		<category><![CDATA[Moodle]]></category>
		<category><![CDATA[Webservices]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/04/12/why-webservices-in-moodle/</guid>
		<description><![CDATA[The number of organizations that use Moodle as their LMS (Learning Management System) is greater every day. From k-12 schools to universities and companies the adoption of Moodle as e-learning platform is growing at a crazy pace. This is great both for the Moodle software and for the community. But as more users and institutions [...]]]></description>
			<content:encoded><![CDATA[<p>The number of organizations that use Moodle as their LMS (Learning Management System) is greater every day. From k-12 schools to universities and companies the adoption of Moodle as e-learning platform is growing at a crazy pace. This is great both for the Moodle software and for the community. But as more users and institutions come into the MoodleVerse, more new ways of  looking at education and requirements for an LMS are set on the table. And Martin Dougiamas and the Moodle Community can keep only one <a href="http://docs.moodle.org/en/Roadmap">roadmap</a> .</p>
<p>Lets remember that Moodle, build on <a href="http://docs.moodle.org/en/Philosophy">philosophical principles on pedagogy (Social Constructionism</a>), typically comes into the  educational spaes by the hand of the teachers with the will to innovate. When the nw LMS is proposed from ABOVE, usually goes towards things like Sakai, if we are lucky and  go FLOSS, or things in the propietary market that we will not name, period.     Right now the Moodle policy is to build on stability, reliability and integration with the needs of the institution. And this is a good thing, cause is the way that the ideas bred in the Moodle communty can spread to as many educational environments as possible.</p>
<p>But still there are plenty of Moodle adopters who have crazy ideas that we&#8217;d love to see out there. Moodle&#8217;s M stands for Modular ( Martin recognizes that on a first stage it meant Martin&#8217;s <img src='http://blogs.dfwikilabs.org/moodle_ws/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) so Moodle can be extended through activity modules, blocks, course formats, hacks, plug-ins, etc. The Moodle contrib is full of that (more than 330 actually). But we do now from on experience that is hard to develop a Moodle extension, open source it, give support to the users, maintain it and, specially, to keep up with the evolution of Moodle ( that in last 3 years has been crazy: look at the Moodle core in Moodle 1.4 and what&#8217;s rigth now in Moodle 1.9&#8230; ) Still one of the keys of  the success of Moodle is the possibility that gives of being extended, cause every big organization wants its information system to adapt (not to adapt the organization itself, like when one implements things like SAP). But organizations need to keep upgrading their customizations to the Moodle version&#8230; and lots of these developments never are published, and lots of members of the community are reinventing the same wheel over and over again. <img src='http://blogs.dfwikilabs.org/moodle_ws/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>And every day appear new connected devices (mobile devices, micro-laptops such as the OLPC, consoles like the Wii, cook gadgets like th iPhone and even virtual artefacts like Virtual worlds like Second Life (to give a not so good example)). All of these artifacts can be possible points of access to the Moodle courses, and even can become scenarios to new learning experiences&#8230; more exciting and innovative than the very Moodle itself.</p>
<p>And we want all of these to talk with Moodle and with the Moodle activities&#8230;</p>
<p>Moodle needs a stable core API that alows the developers to write activities and extensions that survive the Moodle evolution, so they can be ported from one Moodle version to the next&#8230; giving the organizations a garantee of their investment in time, brainpower and off course money. And needs easy ways so external appilcations and devices can talk with it in an easy to develop and secure way&#8230;</p>
<p>Our challenge is to create a kick ass webservices echosystem that Martin Dougiamas will love to put into Moodle core rigth away. That&#8217;s (one of ) our errand.</p>
<p>DFWikiteam out</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/04/12/why-webservices-in-moodle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Arquitectura de los webservices de Moodle</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/04/10/arquitectura-de-los-webservices-de-moodle/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/04/10/arquitectura-de-los-webservices-de-moodle/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 10:25:18 +0000</pubDate>
		<dc:creator>Ferran Recio Calderó</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Castellano]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Technic]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/04/10/arquitectura-de-los-webservices-de-moodle/</guid>
		<description><![CDATA[Para garantizar el éxito de la capa de interoperabilidad es necesario tener en cuenta algunos requisitos:

La capa debe ser accesible desde cualquier sistema de conexión, tanto actual como futuro.
La estructura de la api debe ser versátil para que se adapte a futuras versiones de Moodle.
Las funciones que conforman la api deben ser ampliables para que [...]]]></description>
			<content:encoded><![CDATA[<p>Para garantizar el éxito de la capa de interoperabilidad es necesario tener en cuenta algunos requisitos:</p>
<ul>
<li>La capa debe ser accesible desde cualquier sistema de conexión, tanto actual como futuro.</li>
<li>La estructura de la api debe ser versátil para que se adapte a futuras versiones de Moodle.</li>
<li>Las funciones que conforman la api deben ser ampliables para que las contribuciones o incluso aplicaciones a medida puedan definir más.</li>
<li>El webservice debe adaptarse al sistema de privilegios de Moodle (capabilities) para garantizar la seguridad.</li>
<li>Pese a que el punto de acceso a la api será único y otorgará acceso a todas las partes sistema donde se tengan privilegios, debe existir un medio para especificar qué partes de la api son esenciales para las aplicaciones clientes. Así, será posible optimizar las conexiones incluyendo sólo aquellas funcionalidades que se necesiten.</li>
</ul>
<p>Los anteriores requerimientos nos han llevado a definir la siguiente arquitectura.</p>
<p><a href="http://www.flickr.com/photos/davfer/2403140336/" title="Moodle Webservice architecture diagram by ferran.david, on Flickr"><img src="http://farm4.static.flickr.com/3271/2403140336_0839b85078.jpg" alt="Moodle Webservice architecture diagram" height="434" width="500" /></a></p>
<p>Donde la única parte estática es la referente a la integración de las apis con el medio de conexión. De éste modo es posible ampliar la api o los conectores sin necesidad de replicar código. A diferencia de las grandes librerías de Moodle, las api se basará en librerías específicas que serán incluidas dinámicamente y que podrán ser conectadas o desconectadas a nivel del sitio (site) y requeridas a nivel de aplicación cliente o consumidora.</p>
<p>Además, existen varios conectores para acceder a la api. Cada connector representa un medio de acceso. Para una primera versión hemos trabajado en un conector SOAP y otro de PHP, esté último pensado para aplicaciones que se encuentren en el mismo servidor (o en la misma instancia de Moodle).</p>
<p>La arquitectura esta pensada para que los conectores se usen independientemente de las funciones de la api que sean requeridas. Ésta es la razón por la que cada conector dispone de dos componente básicos:</p>
<ul>
<li>Connect: establece la primera conexión con Moodle y proporciona herramientas para autenticarse en el sistema (login), salir (logout) y especificar que servicios de la api se necesitan. En el caso de conexiones remotas como SOAP, la dirección de &#8220;connect&#8221; será la entrada pública al sistema que nos proporcionará una sesión para usar la api (un tíquet).</li>
<li>InOut: es el encargado de ofrecer al cliente la api unificada con los servicios requeridos y filtrar según los privilegios del usuario autenticado. El acceso a este componente requiere que el usuario esté autenticado y, por tanto, en el caso de las conexiones remotas será necesario usar el componente &#8220;connect&#8221; antes.</li>
</ul>
<p>Como es de suponer, el hecho de pasar por &#8220;connect&#8221; para conseguir una sesión temporal válida no se aplica en el caso del connector director PHP, donde la propia sesión de Moodle remanente en el navegador web ya nos sirve. El trazado de la conexión será tratado en próximos artículos.</p>
<p>Las librerías que contienen los servicios de la api deben definirse de forma que a los conectores les sea posible ofrecerlas a los clientes. Por éste motivo es necesario que cada librería disponga de una función especial, llamada de forma genérica función &#8220;info&#8221;, que sirva de índice para general una definición de operaciones y estructuras (el WSDL en el caso de SOAP y una estructura de datos en el de PHP). La existencia de ésta función conlleva una ventaja clara, cada servició dispondrá de lugar completamente definido donde podrán consultarse de forma fácil las funciones públicas (cosa que en lenguajes como PHP4, donde no existen funciones privadas, es bastante útil). El formato de dicha función se especificará en próximos artículos, así como las limitaciones que implica.</p>
<p>Dado que el montaje de la api se realiza dinámicamente de forma centralizada, es posible separar el webservice en tres capas muy diferenciadas:</p>
<p><a href="http://www.flickr.com/photos/davfer/2403150142/" title="layers by ferran.david, on Flickr"><img src="http://farm3.static.flickr.com/2164/2403150142_05d80d3f1c.jpg" alt="layers" height="347" width="500" /></a></p>
<ul>
<li>Capa de servicios (Service Layer): son todas las librerías que pueden conformar la api. Todas ellas disponen de su propia función &#8220;info&#8221;. La librerías pueden estar agrupadas en paquetes de servicios que pueden ampliarse. Por ejemplo, un paquete podría corresponder a los servicios ofrecidos por los distintos módulos de actividad (fórum, wiki, lección&#8230;), mientras que otro podría garantizar el acceso a funciones de gestión académica hechas a medida.</li>
<li>Capa de integración (Integration Layer): representa la inclusión única de la api. Se divide sólo en dos partes: una para las funciones de login, logout y petición de servicio, y otra que unifica los servicios requeridos para que los conectores puedan ofrecerlos. También es el responsable de unir todos los índices de funciones y estructuras que les devuelven los servicios (con las funciones &#8220;info&#8221;) y combinarlos en una macroestructura</li>
<li>Capa de conexión (Connect Layer): representa el total de conectores que hay activos en el sistema. Cada conector es capaz de interpretar la macroestructura que le devuelve la capa de integración y ofrecerla al cliente.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/04/10/arquitectura-de-los-webservices-de-moodle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El porqué de los webservices en Moodle</title>
		<link>http://blogs.dfwikilabs.org/moodle_ws/2008/04/08/el-porque-de-los-webservices-en-moodle/</link>
		<comments>http://blogs.dfwikilabs.org/moodle_ws/2008/04/08/el-porque-de-los-webservices-en-moodle/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 16:38:24 +0000</pubDate>
		<dc:creator>Ferran Recio Calderó</dc:creator>
				<category><![CDATA[Castellano]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[introduction]]></category>

		<guid isPermaLink="false">http://blogs.dfwikilabs.org/moodle_ws/2008/04/08/el-porque-de-los-webservices-en-moodle/</guid>
		<description><![CDATA[En los últimos años el número de organizaciones que confían en Moodle como su plataforma de e-Learning ha augmentado. Ésto haprovocado que los requerimientos del sistema se hayan diversificado considerablemente. Pese a que Moodle se mantiene fiel a sus principios pedagógicos, que son la clave de su éxito, existe una creciente necesidad de implementar nuevas [...]]]></description>
			<content:encoded><![CDATA[<p>En los últimos años el número de organizaciones que confían en Moodle como su plataforma de e-Learning ha augmentado. Ésto haprovocado que los requerimientos del sistema se hayan diversificado considerablemente. Pese a que Moodle se mantiene fiel a sus principios pedagógicos, que son la clave de su éxito, existe una creciente necesidad de implementar nuevas funcionalidades y, sobre todo, de adaptar el software base a los sistemas de información de las organizaciones donde se implanta.</p>
<p>Por otro lado, cada día aparecen nuevos dispositivos con acceso a  la  Red, como los móviles, que ya se cuentan entre los clientes potenciales para cualquier aplicación en línea. Muchos de estos dispositivos tienen navegadores compatibles, sin embargo, sus monitores y teclados limitados suelen dificultar bastante la navegación por páginas complejas como las de  Moodle. En este sentido, sería conveniente que Moodle facilitase la creación de interfaces alternativas o permitiese la  conexión desde programas externos que ofrezcan vistas no basadas en HTML.</p>
<p>Dentro de la comunidad ya hace tiempo que se tanteo la posibilidad de crear una capa lógica para Moodle que permita extender las funcionalidades del sistema sin necesidad de modificar el código original, una API. El problema es que en las últimas versiones de Moodle se han añadido muchas novedades y modificado una gran parte del núcleo del programa (sobre todo en la versión 1.7 debido a creación de los  roles). En consecuencia, la  dirección de l proyecto ha priorizado la estabilidad de  las modificaciones a implementar y documentar de una API para facilitar las aplicaciones de  terceros.</p>
<p>Como añadido, la creación de la capa de interconexión nos obliga a replantearnos una gran parte de las funciones internas de Moodle y simplificar el código para que sea más usable y comprensible. En este sentido, DFwikiLabs trabajarà junto al equipo de  Moodle.org para ayudar a  mejorar la  calidad del código final.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.dfwikilabs.org/moodle_ws/2008/04/08/el-porque-de-los-webservices-en-moodle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
