En la primera parte se creo todo el código necesario para manipular los datos desde una base de datos MySQL. En el siguiente artículo se definirá el archivo userService.php el cual se encargara de manejar los 4 métodos HTTP para realizar el CRUD. En esta entrega se tratara el diseño e implementación de una API RESTFul.
El diseño de la API será el siguiente:
|
//GET: /users -> Obtener todos los usuarios. //GET: /users/:id -> Obtener usuario con el id :id. //GET: /users/rows:page -> Obtener lista paginada (columnas:pagina). //POST: /users -> Agregar usuario, parámetros: users, name, lastname, email, password, url form unencoded //PUT: /users/:id -> Actualizar Usuario, parámetros users, name, lastname, email, password, url form unencoded //DELETE: /users/:id -> Eliminar Usuario con id :id |
La primera parte a tratar sera el listado de usuarios para lo cual se usa el código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
$database = new Database(); $userDao = new UserDao($database->conn); $method = $_SERVER['REQUEST_METHOD']; //GET methods if ($method=="GET"){ if (isset($_GET['users'])){ if ($_GET['users']==""){//List all users //check if is a paged query if (isset($_GET['limit']) && isset($_GET['page']) && !empty($_GET['limit']) && !empty($_GET['page'])){ $result = $userDao->getUserPaginated($_GET['limit'],$_GET['page']); if(!empty($result)) response(200,"User List paginated.",$result); else response(404,"Not found.",""); }else{ if (!isset($_GET['limit']) && !isset($_GET['page'])){ $result = $userDao->getUsers(); if (!empty($result)) response(200,"User List",$result); else response(404,"Not found.",""); }else response(404,"Not found.",""); } }else{ $result = $userDao->getUserById($_GET['users']); if (!empty($result)){ $array=array(); $array['user'] = $result; response(200,"User by Id",$array); } else response(404,"Not found.",""); } } } |
En primer medida la variable $method guarda el método de petición por el cual fue accedida la Url, esto se logra mirando la variable $_SERVER[‘REQUEST_METHOD’].
Para listar los usuarios se verifica que la variable users este en la URL y dependiendo de su valor se llaman las funciones getUserById si contiene un id (para traer un usuario especifico) o getUserPaginated si están las variables limit y page en la URL, si no están se trae toda la lista de usuarios con la función getUsers.
Los códigos de respuesta usados significan:
- 200: Ok, Cuando se ejecuta una opción con éxito.
- 201: Created, Cuando se ingresa un registro.
- 404: Not Found, Cuando no se encuentra un recurso.
Para una lista completa de códigos se puede revisar el siguiente vínculo.
La función response se encargara de escribir las cabeceras necesarias para cumplir con la respuesta HTTP, la opción «header(‘Access-Control-Allow-Origin: *’)» habilita el acceso de diferentes orígenes y evita el error cors. La línea «header(‘Allow: GET, POST, PUT, DELETE’)» informa los métodos permitidos por el servicio.
|
function response($status,$status_message,$data){ header("HTTP/1.1 ".$status." ".$status_message); header("Access-Control-Allow-Origin: *"); header('Allow: GET, POST, PUT, DELETE'); header("Content-Type:application/json"); $response['status']=$status; $response['status_message']=$status_message; $response['data']=$data; $json_response = json_encode($response,JSON_NUMERIC_CHECK); echo $json_response; } |
La respuesta del servicio se envia en formato JSON y se utiliza la constante JSON_NUMERIC_CHECK para evitar que los números se pongan dentro de comillas. Una respuesta típica del servicio tendrá la estructura:
|
{"status":404,"status_message":"Not found.","data":""} |
Si la consulta es paginada incluirá el objeto pagination para informar el total de páginas, la página anterior, y la siguiente si existen; esto con el fin de facilitar su consumo.
|
{"status":200,"status_message":"User List paginated.","data":{"list":[...],"pagination":{"limit":3,"totalPages":38,"nextPage":21,"prevPage":19}}} |
El método POST se utiliza para crear un nuevo usuario.
|
if ($method=="POST"){ if (isset($_POST['users']) && isset($_POST['name']) && isset($_POST['lastname']) && isset($_POST['email']) && isset($_POST['password'])){ if (!empty($_POST['name']) && !empty($_POST['lastname']) && !empty($_POST['email']) && !empty($_POST['password'])){ $result = $userDao->insertUser(new User(0,$_POST['name'],$_POST['lastname'],$_POST['email'],$_POST['password'])); if ($result==1) response(201,"User created.",$result); else if ($result==-1) response(404,"Email taken.",$result); else response(404,"Cant create user.",$result); }else response(404,"Check data.",""); }else response(404,"Not found.",""); } |
Se verifican las variables users, name, lastname, email, password, si tienen datos validos se realiza el ingreso usando la función insertUser la cual retorna 1 si fue exitoso, -1 si el correo ya esta registrado o 0 en otro caso.
Para eliminar un usuario utilizamos el método DELETE.
|
if ($method=="DELETE"){ if (isset($_GET['users'])){ if (!empty($_GET['users'])){ $result = $userDao->deleteUserById($_GET['users']); if ($result) response(200,"User deleted.",$result); else response(404,"Cant delete user.",$result); }else response(404,"Empty argument.",""); }else response(404,"Not found.",""); } |
Para eliminar el usuario se busca que la variable users contenga un id, la función deleteUserById retorna 1 si se elimino el registro o 0 si no se pudo (por ejemplo el usuario no existe).
Por último para modificar un usuario se utiliza el método PUT.
|
if ($method=='PUT'){ $data = parse_str(file_get_contents('php://input'),$dataArray); if (!empty($dataArray)){ if (!empty($dataArray['users']) && !empty($dataArray['name']) && !empty($dataArray['lastname']) && !empty($dataArray['email']) && !empty($dataArray['password'])){ $result = $userDao->updateUser(new User($dataArray['users'],$dataArray['name'],$dataArray['lastname'],$dataArray['email'],$dataArray['password'])); if ($result) response(201,"User updated.",$result); else response(404,"User not updated.",$result); }else response(404,"Missing argument.",$dataArray); }else response(404,"Missing data.",$dataArray); } |
Para modificar un usuario utilizando el método PUT se debe tener en cuenta que en PHP se utiliza para recibir archivos, por lo cual se utiliza la función file_get_contents para obtener la información enviada. La función parse_str convierte una cadena de petición de estilo variable1=x&variable2=y a un arreglo para acceder más fácil a la información. La forma de acceder este arreglo será $arreglo[‘variable1’]. Si se recibieron todos los datos se procede a utilizar la función updateUser la cual retorna 1 si se actualizo el usuario o 0 en otro caso.
Con estos 4 métodos el archivo userService.php ya esta listo para manejar el CRUD de la tabla usuarios pero hasta el momento no se cumple el diseño inicial del servicio, para lograr esto en un servidor apache debemos crear un archivo .htaccess de la siguiente manera:
|
RewriteEngine on RewriteRule ^users$ userService.php?users [NC,L] RewriteRule ^users/([0-9]+)$ userService.php?users=$1 [NC,L] RewriteRule ^users/([0-9]+):([0-9]+)$ userService.php?users&limit=$1&page=$2 [NC,L] |
Esto nos permite acceder por medio de la ruta users, users/id y users/limit:page como se definió en el diseño inicial. Con esto termina el artículo de la creación de un servicio RESTFul usando PHP.
En la tercera parte explicare como probar el servicio usando Postman.