Servidor REST con PHP y peticiones mediante jquery y ajax.

Un servidor REST (Representational State Transfer) puede ser muy útil para la creación de aplicaciones HTML5. Utilizaríamos el servidor para el módelo de datos y el cliente (navegador) para la lógica de la aplicación, realizando llamadas ajax al servidor que devolvería los datos en formato JSON, por ejemplo. En un sistema REST, cada recurso es direccionable únicamente a través de su URI, y disponemos de un conjunto de aplicaciones (POST, GET, PUT y DELETE), propias del protocolo HTTP, para trabajar con esos recursos.

Por ejemplo, si disponemos de una base de datos de clientes y queremos objetener una lista con ellos, tendríamos que acceder a la URL del recurso "clientes", http://servidor.com/clientes. Una petición GET a este recurso nos devolvería un array con todos los clientes que tenemos en nuestra BB.DD. Si lo que queremos es obtener la información de un cliente en particular, por ejemplo el cliente con identificador igual a 00001, haríamos una petición GET a la url http://servidor.com/clientes/00001. Para crear un cliente nuevo tendríamos que enviar por POST una petición a http://servidor.com/clientes con los datos del nuevo cliente. Para modificar algún dato del cliente 00001 usaríamos una petición PUT con los nuevos datos a http://servidor.com/clientes/00001. Si la petición es DELETE a esa misma url, borraríamos ese registro de la BB.DD. Normalmente los datos que devuelve el servidor estarán en formato JSON o XML. Para nuestro ejemplo utilizaremos JSON, ideal para trabajar con aplicaciones javascript.

Para tratar mediante PHP las peticiones en nuestro servidor utilizaremos un código parecido a este:

$method = $_SERVER['REQUEST_METHOD'];

// tendremos que tratar esta variable para obtener el recurso adecuado de nuestro modelo.
$resource = $_SERVER['REQUEST_URI'];

// Dependiendo del método de la petición ejecutaremos la acción correspondiente.
switch ($method) {
	case 'GET':
		// código para método GET
		break;
	case 'POST':
		$arguments = $_POST;
		// código para método POST
		break;
	case 'PUT':
		parse_str(file_get_contents('php://input'), $arguments);
		// código para método PUT
		break;
	case 'DELETE':
		// código para método DELETE
		break;
}
echo json_encode($response,true); // $response será un array con los datos de nuestra respuesta.

Utilizando jquery es muy sencillo realizar peticiones a nuestro servidor con la función $.ajax:

$.ajax({
	url: 'http://servidor.com/recurso', // url del recurso
	type: "get", // podría ser get, post, put o delete.
	data: {}, // datos a pasar al servidor, en caso de necesitarlo
	success: function (r) {
		// aquí trataríamos la respuesta del servidor
	}
});

Con estas simples indicaciones ya tenemos las bases para la construcción de una aplicación. Si diseñamos bien nuestro modelo de datos tendremos la oportunidad de crear gran variedad de aplicaciones para distintos tipos de clientes (navegadores web, móviles, aplicaciones de escritorio ...), sin tener que modificar nuestro servidor, utilizando un método estandar, sencillo e intuitivo.

Comentarios

Comentario de rafael - 16 de Marzo de 2011 - 04:47
Buen post. Oye resulta que me encuentro ante la situación de realizar peticiones de atributos de archivos a un servidor. sin embargo, esto se va a realizar desde un dispositivo móvil con android y sin siquiera mostrar un navegador web al usuario. Quiero preguntarte, cómo podría pasarle argumentos al servidor, digamos algo como "pasame la lista de todos los archivos del directorio /home/juanito/Desktop/" Cómo podría pasar precisamente dicha ruta como un argumento? Tengo entendido (y los primeros ejemplos me lo confirman) que en REST todo se realiza en base a la URL, sin embargo, pues aun no tengo muy clara la idea de como pasar esta lista de argumentos para la peticion GET
Comentario de Imaginanet - 16 de Marzo de 2011 - 07:30
Hola Rafael. Si lo que quieres es obtener una lista de ficheros de un directorio, quiz&aacute;s lo que mejor podr&iacute;as hacer es tomar los ficheros como el recurso, entoces haciendo una petici&oacute;n GET a la url http://TU_SERVIDOR/ficheros, devolver&iacute;as el listado de ficheros que necesites. Si hay varias rutas de las que puedes sacar los ficheros, la soluci&oacute;n RESTful (ideal), ser&iacute;a que cada ruta fuese un recurso, por ejemplo, para obtener los ficheros de la ruta que t&uacute; indicas, ser&iacute;a mediante una solicitud a http://TU_SERVIDOR/ficheros/home/juanito/Desktop/. Esta soluci&oacute;n es mas dificil de implementar, por lo que a lo mejor te resultar&iacute;a m&aacute;s simple llamar a http://TU_SERVIDOR/ficheros?ruta=/home/juanito/Desktop, pasando la ruta como par&aacute;metro GET. No es una soluci&oacute;n RESTful, pero en tu caso quiz&aacute;s sea m&aacute;s efectivo.<br />
Comentario de rafael - 17 de Marzo de 2011 - 00:23
Si, suena más convincente. De hecho, se supone que no me decanté por utilizar los servicios web vía WSDL/SOAP/UDDI debido a la relativa "complejidad" que esto significaría para un dispositivo móvil. Gracias por tu consejo, me será de gran utilidad. Saludos desde México
Comentario de alejo - 23 de Mayo de 2011 - 14:25
tiene integracion con google maps?
Comentario de cxndxr - 27 de Junio de 2011 - 19:40
Buena info aunque la vdd es muy poca estaria mejor si se pusiera un ejemplo real de la implementacion de ReST y php.
Comentario de Mario - 02 de Diciembre de 2011 - 10:51
Estupendo post, pero una duda... Cualquiera que pusiera, por ejemplo, http://servidor/mario/alumnos podría ver mis alumnos. ¿Cómo podríamos controlar el acceso a nuestro servidor? Lo podríamos hacer pasando un parametro más en nuestra URL, que indique el usuario y maquina desde la cual se esta accediendo, pero esto me parece un poco cutre. ¿Tienes alguna solución? Muchas gracias!
Comentario de becavas - 15 de Enero de 2012 - 22:37
Es seguro acceder al servidor desde jquery ajax?..no existe ningun problema de seguridad?
Comentario de Imaginanet - 16 de Enero de 2012 - 07:24
La idea de REST es no tener que reinventar la rueda, pues el protocolo HTTP ya tiene implementado todo lo que necesitamos, incluido métodos de autenticación, tendríamos que hacer la llamada correspondiente para autenticarnos y luego enviar la información oportuna a través de las cabeceras. También podemos utilizar SSL como medida de seguridad adicional. Pasar mas parámetros en la url haría que nuestra aplicación no fuese RESTFUL.
Comentario de yes - 18 de Febrero de 2012 - 15:31
muy buen post, pero tengo una duda. como puedo obtener las cookies de la pagina debuelta, al realizar una peticion al servidor deseado con request
Comentario de Arturo - 27 de Noviembre de 2012 - 00:29
Hola, tengo la siguiente duda, que pasa si los parametros que necesito pasar son muchos y ademas son cadenas largas, el metodo get ya no me serviria, como lo puedo implementar con el metodo POST ??
Comentario de Osvaldo - 15 de Enero de 2013 - 01:08
Me encantó el post. Pienso en muchas posibilidades emocionantes. ¿Dónde sugieres tu que pueda leer más al respecto?
Comentario de fermin - 15 de Enero de 2013 - 08:39
Para aplicaciones con Phonegap por ejmplo esta es la base, nosotros ustilizamos un frame lamado Slim , y html5+Js +Rest con php es la formula que os hara ganar dinero con apps moviles ;)
Comentario de César - 06 de Mayo de 2013 - 20:13
Muchas gracias.
Comentario de julian cano - 15 de Mayo de 2013 - 22:41
como puedo enviar headers por ajax de jquery?
Comentario de Gonzalo - 07 de Noviembre de 2013 - 16:48
Muchas gracias por tu tutorial !!
Comentario de yareth - 06 de Enero de 2014 - 23:00
Hola, tengo un pequeño problema al momento de recibir la respuesta ajax, me presenta el codigo html que se imprime con el response, al alguna forma de evitar que tambien imprima codigo html, lo único que ocupo es la respuesta a la consulta.
Comentario de Luis L. - 21 de Mayo de 2014 - 16:54
En la petición ajax falto creo yo colocar el la propuedad dataType : json, para que lo que te devuelva sea en ese formato y no una cadena html.
Comentario de Luis - 20 de Enero de 2017 - 14:13
Muy bueno !!! muchas graciasss Saludos desde Perú---
Ha habido un error en el envío
Comentario enviado. Será revisado por la moderación antes de ser publicado.

Deja tu comentario

Tu nombre:
Tu email:
Tu comentario: