AJAX Cross-Domain: JSONP + PHP

En ocasiciones nos encontramos con la necesidad de hacer uso de un servicio web o API externo a nuestro sitio a través de AJAX. Por defecto los navegadores tienen una politica que impide realizar peticiones a otro dominio por razones de seguridad.

Para solventar este problema Bob Ippolito en 2005 propuso el uso de una versión modificada de JSON denominada JSONP. A partir de entonces, muchos sitios y servicios han utilizado esta técnica para que se puedan consumir sus APIs desde una aplicación del lado del cliente.

Hasta hace un par de días, personalmente sólo había utilizado esta técnica desde el lado del consumidor, me parecía algo muy útil, pero nunca me había preocupado del lado del servidor, pero hace poco tuve que implementar un servicio web que debería poder ser accedido a través de una aplicación cliente alojado en otro servidor, por lo que tuve que ponerme a enterarme, y os traigo un tutorial con lo que he aprendido, pongo información tanto del lado del servidor (utilizando PHP), como del lado del cliente (utilizando jQuery).

Lado del servidor

Según la documentación de JSONP, se debe permitir que el cliente añada algo de contenido al JSON devuelto, siendo este englobado en paréntesis, básicamente para que lo que se devuelva sea la “ejecución de un función”, que será creada (de la forma que sea) en el cliente, para su ejecución al finalizar la llamada AJAX.

Por lo tanto, la idea básica es, teniendo un servicio web que devuelva un JSON válido, permitir dos nuevos parámetros: uno para representar el formato que diferenciará las llamadas remotas de las realizadas desde nuestra aplicación (si la hubiera) y otro, el nombre de la función a ejecutar en el cliente. Los nombres típicos de estos parámetros son format (con valor jsonp) y callback (o jsoncallback), aunque no es obligatorio.

El código (en PHP), podría ser algo como:


$format = $_REQUEST['format'];
if($format == "json") {
    if(isset($_REQUEST['callback'])) {
        $callback = $_REQUEST['callback'];
        echo "$callback(" . json_encode($json) . ")";
    } else {
        echo "callbackFunction(" . json_encode($json) . ")";
    }
}

De esta manera, si no se indica una función, indicamos una por defecto, otra opción es no permitirlo y devolver error.
el objecto $json sería la representación de lo que se devolvía desde un principio en el servicio web. Como veis, unicamente hay que concatenar el nombre de la función pasada y los paréntesis. Sencillo, no?

Lado del cliente

Posiblemente sea más conocido, además de que hay muchas formas diferentes de hacerlo, pero voy a poner dos ejemplos usando jQuery.

El primero es la versión más simplista utilizando la función getJSON y la segunda, utilizando la función AJAX completa, con una función aparte incluida.


jQuery.getJSON("http://url.com/directorio/fichero.php?param1=valor1&format=json&callback=?, function(data)
    console.log(data);
}");

 

Con lo que tendríamos una llamada a un JSON que ejecuta la función anónima indicada, en este caso tan simple como imprimir por consola, pero hay iría la lógica, tan complidada como lo que se quiera hacer.

La versión extendida, podría ser:


function logicaCliente(data){
    console.log(data);
}
jQuery.ajax({
    "url": "http://url.com/directorio/fichero.php?param1=valor1&format=json",
    "dataType": "jsonp",
    jsonpCallback: 'logicaCliente'
});

 

Existen multiples variantes de la forma de hacer esto, pero espero que aquellos que en algún momento se encontraran, como yo, perdidos, puedan encontrar ayuda en este pequeño tutorial.

Fuentes:

Blog de Bob Ippolito

Use Jquery

jQuery JSONP

Usando Zend framework en Eclipse

Desde que cambié de trabajo he estado trabajando en un proyecto realizado en PHP usando Zend Framework y aunque yo siempre he estado acostumbrado a Eclipse (tanto en Java como en PHP), en la empresa se trabajaba con NetBeans y he estado intentando adaptarme a este IDE, a su forma de uso.

Después de bastante tiempo usándolo, sigo sin cogerle el gusto a NetBeans, así que me propuse conseguir integrar Zend Framework en eclipse y aunque no he conseguido tener una utilidad como la de crear proyectos y componentes que tiene NetBeans, por lo menos he conseguido tener el autocompletado y para todo lo demás uso la linea de comandos.

Los pasos para conseguirlos son sencillos y se basan en importar la librería de Zend Framework en el eclipse y en el proyecto concreto, de la siguiente manera (suponiendo que ya tenemos Zend framerwork descargado):

  • Incluir el directorio de Zend como librería en el eclipse: para ello, pulsamos sobre Window > Preferences > PHP > PHP Libraries y ahí pulsamos en New… nombramos la librería como queramos y Ok, a continuación nos colocamos sobre el nuevo elemento creado y pulsamos sobre Add External folder… y ahí seleccionamos el directorio en el que tengamos Zend Framework descargado y descomprimido.
  • Incluir la librería de Zend en el proyecto: para ello, nos colocamos sobre el proyecto concreto en la vista de Navigator o Package Explorer y ahí botón derecho > properties > PHP Include Path y ahí pulsamos sobre Add Library > User Library y elegimos la anteriormente incluida en el eclipse y Ok.

Y ya está, se tirará un rato hasta que funciona rápido y bien, pero al cabo de un rato tendremos Zend Framework como librería y podremos usar el autocompletado de clases y métodos, lo que nos será muy útil para realizar nuestros proyectos.

Me he tirado algo de tiempo para encontrar la solución, pero principalmente está sacado (como no) de una entrada en stackoverflow.

Aporta seguridad a tus aplicaciones PHP con PHPIDS

Si eres desarrollador PHP o has realizado algún proyecto web utilizando éste lenguaje de programación y deseas darle la máxima seguridad a tu aplicación, sería bueno que echaras un vistazo a la herramienta PHPIDS.

Esta herramienta permite detectar y controlar los ataques más clásicos sobre aplicaciones escritas en PHP, se trata básicamente de una capa extra que se añade al código escrito y que permite detectar y solucionar dichos problemas se seguridad.

Los ataques que indica que detecta son: XSS, SQL Injection, header injection, directory traversal, RFE/LFI, DoS y LDAP attacks.

Requiere al menos la versión 5.1.6 de PHP para que se puedan utilizar todas las características de la herramienta.
Es bastante fácil de instalar y se puede configurar al gusto para controlar y realizar acciones específicas, guardar los datos en formatos concretos y demás.

Se puede incluso ver una demo de como trabaja la herramienta, y ya sabes si te gusta descárgala y empieza usarla para dar más seguridad a tus aplicaciones PHP.

Proyecto personal: Java2C#

A partir de una práctica de la universidad he comenzado un proyecto personal de programación que puede resultar muy interesante, se trata de un traductor entre los lenguajes Java y C#.

La práctica fue realizada para la asignatura Procesadores del Lenguaje y se trataba de un traductor de Java a C#, incluye gran parte del lenguaje Java, aunque la parte del control semántico está bastante limitado. En cuanto a la parte de la traducción, es lo más completa posible, aunque limitada en algunos puntos por el control semántico o por la gramática seleccionada.

Intentaré dedicar unas pocas horas semanales a mejorar el proyecto e iré realizando nuevas versiones, entre las que quiero incluir una mejora de la gramática para incluir las nuevas especificaciones del lenguaje Java (de momento se podría decir que es de la versión 1.3 del lenguaje), perfeccionamiento de los mensajes de error y avisos, mejora de uso, mejora en la traducción e inclusión de warnings por variables sin usar y esas cosas.

Si alguien está interesado en el tema, me puede contactar en mi dirección de correo: cesarcruz85[at]gmail.com.