<?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>Nokrosis &#187; SOAP</title>
	<atom:link href="http://nokrosis.com/tag/soap/feed/" rel="self" type="application/rss+xml" />
	<link>http://nokrosis.com</link>
	<description>Tecnología, programación, entretenimiento, conocimiento.</description>
	<lastBuildDate>Fri, 07 May 2010 13:11:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Conociendo las APIs (Parte 2)</title>
		<link>http://nokrosis.com/2008/07/conociendo-las-apis-parte-2/</link>
		<comments>http://nokrosis.com/2008/07/conociendo-las-apis-parte-2/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 03:20:45 +0000</pubDate>
		<dc:creator>Nokrosis</dc:creator>
				<category><![CDATA[Conociendo las APIs]]></category>
		<category><![CDATA[API's]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://nokrosis.com/?p=13</guid>
		<description><![CDATA[En el post anterior vimos los formularios web y observamos lo que sucedia &#8220;tras bambalinas&#8221; en términos de solicitudes y datos transferidos; como ejemplo, intentamos emular un formulario web específico por medio de un script PHP que enviaba una solicitud al servidor web e interpretaba el resultado para obtener información relevante. La conclusión fue: es [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nokrosis.com/2008/07/conociendo-las-apis-parte-1">En el post anterior</a> vimos los formularios web y observamos lo que sucedia &#8220;tras bambalinas&#8221; en términos de solicitudes y datos transferidos; como ejemplo, intentamos emular un formulario web específico por medio de un script PHP que enviaba una solicitud al servidor web e interpretaba el resultado para obtener información relevante. La conclusión fue: <strong>es posible, pero no es limpio.</strong> En esta entrada veremos qué tan transparente puede ser la automatización.</p>
<h2>Parte 2: El XML rocks!</h2>
<p>Una <strong>Interfaz de Programación de Aplicaciones (API en inglés)</strong> es una colección de procedimientos predefinidos para que un programa pueda usar a otro. En la Internet, una API hará posible que una <strong>computadora</strong> use a otra. Contrariamente al método del hacker explicado previamente, las APIs están destinadas a ser soportadas oficialmente por los propietarios de la aplicación web a través de documentación y soporte extensos. Tu script ya no intentará imitar de forma humana los nombres de variables y la URL del action, sino que más bien tomará <strong>su propia ruta para obtener datos del servidor.</strong><span id="more-13"></span></p>
<p>Las mayoría de las APIs se basan en <strong>XML</strong>, que hace posible transferir datos estructurados a través de la web. Básicamente, en lugar de enviar variables POST simples al servidor y recibir HTML, tu petición enviará y recibirá datos XML <strong>limpios e inmutables.</strong></p>
<p>Al inicio, no hay límite para imaginar y diseñar una API. Basándonos en los ejemplos de la <a href="http://nokrosis.com/2008/07/conociendo-las-apis-parte-1">parte 1</a>, podemos imaginar la siguiente forma de solicitud y respuesta:</p>
<pre>POST /submit HTTP/1.1
Host: api.community.com
Content-Length: 125
Content-Type: application/text-xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
 &lt;datos&gt;
	&lt;nombre&gt;Juan&lt;/nombre&gt;
	&lt;ciudad&gt;Guadalajara&lt;/ciudad&gt;
	&lt;edad&gt;23&lt;/edad&gt;
 &lt;/datos&gt;</pre>
<p><em>Nota: es muy comun diseñar la API de tal forma que las solicitudes se envíen a un subdominio como api.comunidad.com. De esta forma, las solicitudes al subdominio <strong>www</strong> se supone que son enviadas por seres humanos y devuelven respuestas HTML mientras que las solicitudes en el subdominio <strong>api</strong> se supone que son enviadas por computadoras y devuelven respuestas XML. También notemos que quité la extensión .php de la página de <strong>submit </strong>(envío): a través de la API, no estamos accesando a una <strong>página</strong> sino a un <strong>recurso</strong>.<br />
</em></p>
<pre>HTTP/1.1 200 OK
Date: Tue, 17 Jun 2008 20:24:00 GMT
Content-Length: 111
Content-Type: application/text-xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;datos&gt;
    &lt;nombre&gt;Anna&lt;/nombre&gt;
    &lt;nombre&gt;Lisa&lt;/nombre&gt;
  &lt;/datos&gt;</pre>
<p>Programáticamente hablando, codificar la solicitud en PHP es posible usando <a href="http://php.net/curl">cURL</a> e interpretar la respuesta certamente sería más fácil usando <a href="http://php.net/simplexml">SimpleXML</a> (incluida en PHP5). Por lo tanto, implementar la llamada API anterior en PHP se vería así:</p>
<pre>&lt;?php

   // PASO 1: ENVIAR LA SOLICITUD
   $url = 'http://api.comunidad.com/submit';
   $header = array('Content-type: application/text-xml');
   $xml = '&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;data&gt;&lt;name&gt;Joe&lt;/name&gt;
           &lt;city&gt;Indianapolis&lt;/city&gt;&lt;age&gt;23&lt;/age&lt;/data&gt;';
   $handle = curl_init();
   curl_setopt($handle, CURLOPT_URL, $url);
   curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
   curl_setopt($handle, CURLOPT_POSTFIELDS, $xml);
   curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
   $response = curl_exec($handle);
   curl_close($handle);

   // PASO 2: INTERPRETAR EL RESULTADO E IMPRIMIR LOS NOMBRES
   $result = new SimpleXMLElement($response);
   $val = array();
   foreach ($result-&gt;nombre as $nombre) {
      $val[] = (string) $nombre;
   }
   print_r($values);

?&gt;</pre>
<p><em>Nots: en este script cURL tuve que especificar el encabezado <strong>Content-type</strong> para que nuestra solicitud fuera interpretada correctamente por el servidor. Pude haber usado algunas opciones más como CURLOPT_TIMEOUT, por ejemplo.<br />
</em></p>
<p>Usar una API es mejor que forzar un formulario web por 3 razones:</p>
<ul>
<li>La solicitud pasa por una ruta especial diseñada para computadoras que está claramente definida en el subdominio api.comunidad.com</li>
<li>Los datos de la respuesta están estructurados de mejor forma y son más fáciles de interpretar que una página plana en HTML.</li>
<li>Los desarrolladores de comunidad.com, deben comprometerse en mantener un <strong>formato XML constante</strong> para las respuestas XML que son entregadas a las máquinas<strong></strong>: esto significa, por ejemplo, que no pueden drásticamente dejar de aceptar las etiquetas &lt;ciudad&gt; en las solicitudes, o cambiar &lt;nombre&gt; por &lt;persona&gt; en las etiquetas de la respuesta (o de lo contrario, podrían generar un terrible desastre en las aplicaciones de terceras partes que aprovechan su API).</li>
</ul>
<p>Esta última razón se resume bien en la <a href="http://www.slideshare.net/guestbe92f4/how-to-design-a-good-a-p-i-and-why-it-matters-g-o-o-g-l-e/">famosa nota</a> de Joshua Bloch de Google sobre el diseño de APIs:</p>
<blockquote><p>Las APIs públicas son para siempre &#8211; una oportunidad para hacerla bien.</p></blockquote>
<p>En el ejemplo anterior, asumimos que los desarrolladores de comunidad.com crearon una API desde cero, inventando una estructura XML personalizada para solicitudes y respuestas. Cuando se trata de diseñar una API, la realidad es que los desarrolladores tienden a respetar algunas <strong>estructuras API existentes</strong> diseñadas específicamente para APIs de tal forma que la API sea más fácil de aprender y ser usada para desarrolladores de terceras partes.</p>
<p>Hoy en día, 3 estándares API son usados ampliamente en la web:</p>
<ul>
<li><strong>REST</strong> (REpresentational State Transfer)</li>
<li><strong>XML-RPC </strong>(XML Remote Procedure Call)</li>
<li><strong>SOAP</strong> (Simple Object Access Protocol)</li>
</ul>
<p>En los siguientes posts echaremos un ojo a estos tres estándares XML con ejemplos detallados de cómo enviar y recibir datos.</p>
<p><em>(Traducción realizada por Nokrosis, del post original de Nemetral)</em></p>
<p>Continuará&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://nokrosis.com/2008/07/conociendo-las-apis-parte-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
