Un servidor REST es una aplicación que nos permite crear, actualizar, eliminar y recuperar datos de forma remota siguiendo el estandar de diseño REST. Lo habitual cuando programamos, por ejemplo peticiones ajax, es nombrar las urls como «/obtenerProducto», «/crearProducto», etc. En REST los verbos «obtener» o «crear» no se usan, ya que se utiliza una única url para todas las acciones, en nuestro ejemplo «/producto». Además, REST nombra a estas urls como recursos.

Para poder diferenciar la acción que se está realizando sobre un recurso concreto se utiliza un método u otro en la petición: GET, POST, PUT o DELETE.

Podemos detectar el método que se usa e indicarle a la aplicación las acciones que debe realizar en cada caso. Cada método tiene un uso:

  • GET: Obtener datos de un recurso.
  • POST: Crear un nuevo elemento (un producto, un usuario).
  • PUT: Actualizar los datos de un recurso.
  • DELETE: Eliminar los datos de un recurso.

Os dejo un código muy, muy sencillo para la creación de un servidor REST. He intentado que sea lo más básico y sencillo posible. Además he añadido un pequeño detalle que no se suele ver en estos ejemplos por internet, que es cómo obtener los datos que llegan al servidor en un archivo xml. En realidad se usa el buffer de entrada de PHP (php://input) para recuperar los datos.

El ejemplo muestra como obtener los datos que nos llegan en la petición y devolverlos como resultado de la petición. A partir de ahí es todo vuestro.

[codesyntax lang=»php»]

<?php

$method = $_SERVER['REQUEST_METHOD'];
$resource = $_SERVER['REQUEST_URI'];
$request = $_SERVER['HTTP_REQUEST'];

switch($method) {
  case 'GET':
    $string_xml_get = $_GET;
    break;
  case 'POST':
    $string_xml_post['POST'] = $_POST;
    
    // Si los datos se envían como un xml lo habitual será que se guarden en el 
    // buffer de entrada de php
    // Tendrás que cambiar esta línea por la anterior, dependiendo de por donde provengan los datos
    $string_xml_post['INPUT'] = file_get_contents('php://input');
    break;
  case 'PUT':
    parse_str(file_get_contents('php://input'), $string_xml_put);
    break;
  case 'DELETE':
    $string_xml_delete = $_REQUEST;
    break;
}

if (!empty($string_xml_get)) {
  print 'Resultado por GET: ' . print_r($string_xml_get, true) . "\n\r";
}
elseif (!empty($string_xml_post)) {
  print 'Resultado por POST: ' . print_r($string_xml_post, true) . "\n\r";
}
elseif (!empty($string_xml_put)) {
  print 'Resultado por PUT: ' . $string_xml_put . "\n\r";
}
elseif (!empty($string_xml_delete)) {
  print 'Resultado por DELETE: ' . print_r($string_xml_delete, true) . "\n\r";
}

[/codesyntax]