Compare commits
4 Commits
251cebdb37
...
eea515c805
Author | SHA1 | Date | |
---|---|---|---|
eea515c805 | |||
e34e1b37c0 | |||
42771264b5 | |||
1370cec5c3 |
33
README.md
33
README.md
@ -1,5 +1,12 @@
|
|||||||
# Apuntes PHP REST API
|
# Apuntes PHP REST API
|
||||||
|
|
||||||
|
Proyecto realizado con fines didácticos, con el propósito de comprender la
|
||||||
|
creación y funcionamiento de una API básica utilizando **Php** y **Apache**.
|
||||||
|
Además de servir de introducción los mismos.
|
||||||
|
|
||||||
|
Las clases, metodos y funciones creadas dentro de este proyecto cumplen este
|
||||||
|
propósito. No estan diseñadas para correr en un entorno de producción.
|
||||||
|
|
||||||
### Requerimientos
|
### Requerimientos
|
||||||
|
|
||||||
[MariaDB](https://mariadb.com/docs/), [Apache](https://httpd.apache.org/docs/)
|
[MariaDB](https://mariadb.com/docs/), [Apache](https://httpd.apache.org/docs/)
|
||||||
@ -36,7 +43,9 @@ cd /var/www/
|
|||||||
sudo ln -s $HOME/projects/apirest html
|
sudo ln -s $HOME/projects/apirest html
|
||||||
```
|
```
|
||||||
|
|
||||||
`/etc/apache2/apache2.conf`
|
Editar archivo de configuración de apache `sudoedit /etc/apache2/apache2.conf`
|
||||||
|
|
||||||
|
Agregar:
|
||||||
|
|
||||||
```apache
|
```apache
|
||||||
<Directory /var/www/>
|
<Directory /var/www/>
|
||||||
@ -60,7 +69,7 @@ sudo systemctl restart apache2
|
|||||||
|
|
||||||
> ¿Como mostrar errores en php? [stackoverflow](https://stackoverflow.com/questions/1053424/how-do-i-get-php-errors-to-display).
|
> ¿Como mostrar errores en php? [stackoverflow](https://stackoverflow.com/questions/1053424/how-do-i-get-php-errors-to-display).
|
||||||
|
|
||||||
Agregar la sgte. linea en `.htaccess`
|
Agregar la sgte. linea en archivo [.htaccess](./apirest_yt/.htaccess)
|
||||||
|
|
||||||
```apache
|
```apache
|
||||||
php_flag display_errors 1
|
php_flag display_errors 1
|
||||||
@ -81,7 +90,8 @@ display_errors = On
|
|||||||
|
|
||||||
## Inicio del proyecto
|
## Inicio del proyecto
|
||||||
|
|
||||||
Crear y poblar base de datos, según archivo `./original/database/apirest.sql`.
|
Crear y poblar base de datos, según [archivo sql](./original/database/apirest.sql)
|
||||||
|
en `./original/database/apirest.sql`.
|
||||||
|
|
||||||
Crear archivo de configuración en la ruta `./<projecto>/clases/conexion/config`.
|
Crear archivo de configuración en la ruta `./<projecto>/clases/conexion/config`.
|
||||||
|
|
||||||
@ -99,11 +109,24 @@ Crear archivo de configuración en la ruta `./<projecto>/clases/conexion/config`
|
|||||||
|
|
||||||
#### Creación de token
|
#### Creación de token
|
||||||
|
|
||||||
Combinación de 2 funciones de *php* para generar un *token* único en `<proyecto>/clases/auth.class.php`
|
Combinación de 2 funciones de *php* para generar un *token* único en [archivo](./apirest_yt/clases/auth.class.php)
|
||||||
|
`<proyecto>/clases/auth.class.php`.
|
||||||
|
|
||||||
- Función [bin2hex](https://www.php.net/manual/en/function.bin2hex.php) devuelve
|
- Función [bin2hex](https://www.php.net/manual/en/function.bin2hex.php) devuelve
|
||||||
un `string` *hexadecimal*.
|
un *string hexadecimal*.
|
||||||
- Función [openssl_random_pseudo_bytes](https://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php).
|
- Función [openssl_random_pseudo_bytes](https://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php).
|
||||||
|
|
||||||
> [Metodos HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)
|
> [Metodos HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)
|
||||||
|
|
||||||
|
#### Desactivar tokens
|
||||||
|
|
||||||
|
Cron Job para cambiar estado de tokens a ***Inactivo***
|
||||||
|
|
||||||
|
Agregar tarea: `crontab -e`
|
||||||
|
|
||||||
|
ej. Ejecutar tarea cada 5 minutos.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# m h dom mon dow command
|
||||||
|
*/5 * * * * curl localhost/php_apirest/apirest_yt/cron/actualizar_tokens &>/dev/null
|
||||||
|
```
|
||||||
|
63
apirest_yt/assets/estilo.css
Normal file
63
apirest_yt/assets/estilo.css
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
body{
|
||||||
|
color:black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.container {
|
||||||
|
margin: 10px;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
box-shadow: 0 0 8px #D0D0D0;
|
||||||
|
}
|
||||||
|
h1{
|
||||||
|
color: #444;
|
||||||
|
background-color: transparent;
|
||||||
|
border-bottom: 1px solid #D0D0D0;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 0 0 14px 0;
|
||||||
|
padding: 14px 15px 10px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
display: block;
|
||||||
|
font-size: 1.5em;
|
||||||
|
-webkit-margin-before: 0.83em;
|
||||||
|
-webkit-margin-after: 0.83em;
|
||||||
|
-webkit-margin-start: 0px;
|
||||||
|
-webkit-margin-end: 0px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
display: block;
|
||||||
|
-webkit-margin-before: 1em;
|
||||||
|
-webkit-margin-after: 1em;
|
||||||
|
-webkit-margin-start: 0px;
|
||||||
|
-webkit-margin-end: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.divbody{
|
||||||
|
margin: 0 15px 0 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.divfooter {
|
||||||
|
text-align: right;
|
||||||
|
font-size: 16px;
|
||||||
|
border-top: 1px solid #D0D0D0;
|
||||||
|
line-height: 32px;
|
||||||
|
padding: 0 10px 0 10px;
|
||||||
|
margin: 20px 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-family: Consolas, Monaco, Courier New, Courier, monospace;
|
||||||
|
font-size: 16px;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
color: #002166;
|
||||||
|
display: block;
|
||||||
|
margin: 14px 0 14px 0;
|
||||||
|
padding: 12px 10px 12px 10px;
|
||||||
|
}
|
@ -3,7 +3,6 @@ require_once 'conexion/conexion.php';
|
|||||||
require_once 'clases/respuestas.class.php';
|
require_once 'clases/respuestas.class.php';
|
||||||
|
|
||||||
class pacientes extends conexion{
|
class pacientes extends conexion{
|
||||||
|
|
||||||
private $table = "pacientes";
|
private $table = "pacientes";
|
||||||
private $pacienteid = "";
|
private $pacienteid = "";
|
||||||
private $dni = "";
|
private $dni = "";
|
||||||
@ -14,12 +13,13 @@ class pacientes extends conexion{
|
|||||||
private $telefono = "";
|
private $telefono = "";
|
||||||
private $fecha_nacimiento = "0000-00-00";
|
private $fecha_nacimiento = "0000-00-00";
|
||||||
private $correo = "";
|
private $correo = "";
|
||||||
|
private $token = "";
|
||||||
|
// 532c75dac0f7f4d311300302538ab49f
|
||||||
|
|
||||||
public function listaPacientes($pagina = 1){
|
public function listaPacientes($pagina = 1){
|
||||||
// paginador
|
// paginador
|
||||||
$inicio = 0;
|
$inicio = 0;
|
||||||
$cantidad = 100;
|
$cantidad = 10;
|
||||||
if ($pagina > 1){
|
if ($pagina > 1){
|
||||||
$inicio = ($cantidad * ($pagina - 1)) + 1;
|
$inicio = ($cantidad * ($pagina - 1)) + 1;
|
||||||
$cantidad = $cantidad * $pagina;
|
$cantidad = $cantidad * $pagina;
|
||||||
@ -39,6 +39,14 @@ class pacientes extends conexion{
|
|||||||
public function post($json){
|
public function post($json){
|
||||||
$_respuestas = new respuestas;
|
$_respuestas = new respuestas;
|
||||||
$datos = json_decode($json, true);
|
$datos = json_decode($json, true);
|
||||||
|
|
||||||
|
// validación token
|
||||||
|
if (!isset($datos['token'])){
|
||||||
|
return $_respuestas->error_401();
|
||||||
|
} else {
|
||||||
|
$this->token = $datos['token'];
|
||||||
|
$arrayToken = $this->buscarToken();
|
||||||
|
if ($arrayToken){
|
||||||
if (!isset($datos['nombre']) || !isset($datos['dni']) || !isset($datos['correo'])){
|
if (!isset($datos['nombre']) || !isset($datos['dni']) || !isset($datos['correo'])){
|
||||||
return $_respuestas->error_400();
|
return $_respuestas->error_400();
|
||||||
} else {
|
} else {
|
||||||
@ -61,6 +69,10 @@ class pacientes extends conexion{
|
|||||||
return $_respuestas->error_500();
|
return $_respuestas->error_500();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return $_respuestas->error_401("Token inválido o caducado");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function insertarPaciente(){
|
private function insertarPaciente(){
|
||||||
@ -80,6 +92,14 @@ class pacientes extends conexion{
|
|||||||
public function put($json){
|
public function put($json){
|
||||||
$_respuestas = new respuestas;
|
$_respuestas = new respuestas;
|
||||||
$datos = json_decode($json, true);
|
$datos = json_decode($json, true);
|
||||||
|
|
||||||
|
// validación token
|
||||||
|
if (!isset($datos['token'])){
|
||||||
|
return $_respuestas->error_401();
|
||||||
|
} else {
|
||||||
|
$this->token = $datos['token'];
|
||||||
|
$arrayToken = $this->buscarToken();
|
||||||
|
if ($arrayToken){
|
||||||
if (!isset($datos['pacienteid'])){
|
if (!isset($datos['pacienteid'])){
|
||||||
return $_respuestas->error_400();
|
return $_respuestas->error_400();
|
||||||
} else {
|
} else {
|
||||||
@ -105,6 +125,10 @@ class pacientes extends conexion{
|
|||||||
return $_respuestas->error_500();
|
return $_respuestas->error_500();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return $_respuestas->error_401("Token inválido o caducado");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function modificarPaciente(){
|
private function modificarPaciente(){
|
||||||
@ -122,6 +146,72 @@ class pacientes extends conexion{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function delete($json){
|
||||||
|
$_respuestas = new respuestas;
|
||||||
|
$datos = json_decode($json, true);
|
||||||
|
|
||||||
|
// validación token
|
||||||
|
if (!isset($datos['token'])){
|
||||||
|
return $_respuestas->error_401();
|
||||||
|
} else {
|
||||||
|
$this->token = $datos['token'];
|
||||||
|
$arrayToken = $this->buscarToken();
|
||||||
|
if ($arrayToken){
|
||||||
|
if (!isset($datos['pacienteid'])){
|
||||||
|
return $_respuestas->error_400();
|
||||||
|
} else {
|
||||||
|
$this->pacienteid = $datos['pacienteid'];
|
||||||
|
$resp = $this->eliminarPaciente();
|
||||||
|
if ($resp){
|
||||||
|
$respuesta = $_respuestas->response;
|
||||||
|
$respuesta['result'] = array(
|
||||||
|
//'filas_afectadas' => $resp,
|
||||||
|
'pacienteid' => $this->pacienteid
|
||||||
|
);
|
||||||
|
return $respuesta;
|
||||||
|
} else {
|
||||||
|
return $_respuestas->error_500();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return $_respuestas->error_401("Token inválido o caducado");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function eliminarPaciente(){
|
||||||
|
$query = "DELETE FROM $this->table WHERE PacienteId = '$this->pacienteid'";
|
||||||
|
$resp = parent::nonQuery($query);
|
||||||
|
if ($resp >= 1){
|
||||||
|
return $resp;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buscarToken(){
|
||||||
|
$query = "SELECT TokenId,UsuarioId,Estado FROM usuarios_token
|
||||||
|
WHERE Token = '$this->token' AND Estado = 'Activo'";
|
||||||
|
$resp = parent::obtenerDatos($query);
|
||||||
|
if ($resp){
|
||||||
|
return $resp;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sin implementación
|
||||||
|
//private function actualizarToken($tokenid){
|
||||||
|
// $date = date("Y m d H:i");
|
||||||
|
// $query = "UPDATE usuarios_token SET Fecha = '$date'
|
||||||
|
// WHERE TokenId = '$tokenid'";
|
||||||
|
// $resp = parent::nonQuery($query);
|
||||||
|
// if ($resp >= 1){
|
||||||
|
// return $resp;
|
||||||
|
// } else {
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -42,6 +42,14 @@ class respuestas{
|
|||||||
return $this->response;
|
return $this->response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function error_401($mensaje = "No autorizado"){
|
||||||
|
$this->response['status'] = "error";
|
||||||
|
$this->response['result'] = array(
|
||||||
|
"error_id" => "401",
|
||||||
|
"error_msg" => $mensaje
|
||||||
|
);
|
||||||
|
return $this->response;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
16
apirest_yt/clases/token.class.php
Normal file
16
apirest_yt/clases/token.class.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
require_once 'conexion/conexion.php';
|
||||||
|
|
||||||
|
class token extends conexion{
|
||||||
|
public function actualizarToken($fecha){
|
||||||
|
$query = "UPDATE usuarios_token SET Estado = 'Inactivo'
|
||||||
|
WHERE Fecha < '$fecha' AND Estado = 'Activo'";
|
||||||
|
$verificar = parent::nonQuery(($query));
|
||||||
|
if ($verificar > 0){
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
8
apirest_yt/cron/actualizar_tokens.php
Normal file
8
apirest_yt/cron/actualizar_tokens.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once '../clases/token.class.php';
|
||||||
|
$_token = new token;
|
||||||
|
$fecha = date('Y-m-d H:i');
|
||||||
|
echo $_token->actualizarToken($fecha);
|
||||||
|
|
||||||
|
?>
|
@ -1,20 +1,83 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>API de Prueba</title>
|
||||||
|
<link rel="stylesheet" href="assets/estilo.css" type="text/css">
|
||||||
|
</head>
|
||||||
<?php
|
<?php
|
||||||
echo "INDEX.php".'</br>';
|
// echo "INDEX.php".'</br>';
|
||||||
|
|
||||||
require_once "clases/conexion/conexion.php";
|
// require_once "clases/conexion/conexion.php";
|
||||||
|
// $conector = new conexion;
|
||||||
|
// $conector->test_conector();
|
||||||
|
|
||||||
$conector = new conexion;
|
// # Prueba Select
|
||||||
|
// $query = "SELECT * FROM pacientes";
|
||||||
#$conector->test_conector();
|
// echo '<pre>'; print_r($conector->obtenerDatos($query)); echo '</pre>';
|
||||||
|
|
||||||
// Prueba Select
|
|
||||||
#$query = "SELECT * FROM pacientes";
|
|
||||||
#echo '<pre>'; print_r($conector->obtenerDatos($query)); echo '</pre>';
|
|
||||||
|
|
||||||
// Prueba insert
|
|
||||||
#$query = "INSERT INTO pacientes (DNI)value('0')";
|
|
||||||
#echo '<pre>'; print_r($conector->nonQuery($query)); echo '</pre>';
|
|
||||||
#$query = "INSERT INTO pacientes (DNI)value('1')";
|
|
||||||
#echo '<pre>'; print_r($conector->nonQueryId($query)); echo '</pre>';
|
|
||||||
|
|
||||||
|
// # Prueba insert
|
||||||
|
// $query = "INSERT INTO pacientes (DNI)value('0')";
|
||||||
|
// echo '<pre>'; print_r($conector->nonQuery($query)); echo '</pre>';
|
||||||
|
// $query = "INSERT INTO pacientes (DNI)value('1')";
|
||||||
|
// echo '<pre>'; print_r($conector->nonQueryId($query)); echo '</pre>';
|
||||||
?>
|
?>
|
||||||
|
<!-- Space char " " -->
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Api de Prueba</h1>
|
||||||
|
<div class="divbody">
|
||||||
|
<h3>Auth - login</h3>
|
||||||
|
<code>
|
||||||
|
POST /auth</br>
|
||||||
|
{</br>
|
||||||
|
"usuario" :"", -> REQUERIDO</br>
|
||||||
|
"password": "" -> REQUERIDO</br>
|
||||||
|
}
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
<div class="divbody">
|
||||||
|
<h3>Pacientes</h3>
|
||||||
|
<code>
|
||||||
|
GET /pacientes?page=$numeroPagina</br>
|
||||||
|
GET /pacientes?id=$idPaciente
|
||||||
|
</code>
|
||||||
|
<code>
|
||||||
|
POST /pacientes</br>
|
||||||
|
{</br>
|
||||||
|
"nombre" : "", -> REQUERIDO</br>
|
||||||
|
"dni" : "", -> REQUERIDO</br>
|
||||||
|
"correo":"", -> REQUERIDO</br>
|
||||||
|
"codigoPostal" :"",</br>
|
||||||
|
"genero" : "",</br>
|
||||||
|
"telefono" : "",</br>
|
||||||
|
"fechaNacimiento" : "",</br>
|
||||||
|
"token" : "" -> REQUERIDO</br>
|
||||||
|
}
|
||||||
|
</code>
|
||||||
|
<code>
|
||||||
|
PUT /pacientes</br>
|
||||||
|
{</br>
|
||||||
|
"nombre" : "",</br>
|
||||||
|
"dni" : "",</br>
|
||||||
|
"correo":"",</br>
|
||||||
|
"codigoPostal" :"",</br>
|
||||||
|
"genero" : "",</br>
|
||||||
|
"telefono" : "",</br>
|
||||||
|
"fechaNacimiento" : "",</br>
|
||||||
|
"token" : "" , -> REQUERIDO</br>
|
||||||
|
"pacienteId" : "" -> REQUERIDO</br>
|
||||||
|
}
|
||||||
|
</code>
|
||||||
|
<code>
|
||||||
|
DELETE /pacientes</br>
|
||||||
|
{</br>
|
||||||
|
"token" : "", -> REQUERIDO</br>
|
||||||
|
"pacienteId" : "" -> REQUERIDO</br>
|
||||||
|
}
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
@ -51,7 +51,28 @@ if ($_SERVER['REQUEST_METHOD'] == "GET"){
|
|||||||
echo json_encode($datosArray);
|
echo json_encode($datosArray);
|
||||||
|
|
||||||
} else if ($_SERVER['REQUEST_METHOD'] == "DELETE"){
|
} else if ($_SERVER['REQUEST_METHOD'] == "DELETE"){
|
||||||
echo "hola DELETE";
|
|
||||||
|
// recepción de datos
|
||||||
|
$headers = getallheaders();
|
||||||
|
if (isset($headers['token']) && isset($headers['pacienteid'])){
|
||||||
|
$datos_header = [
|
||||||
|
"token" => $headers["token"],
|
||||||
|
"pacienteid" => $headers["pacienteid"]
|
||||||
|
];
|
||||||
|
$datos = json_encode($datos_header);
|
||||||
|
} else {
|
||||||
|
$datos = file_get_contents("php://input");
|
||||||
|
}
|
||||||
|
// envio de datos al manejador
|
||||||
|
$datosArray = $_pacientes->delete($datos);
|
||||||
|
// devolucion de respuesta
|
||||||
|
if(isset($datosArray["result"]["error_id"])){
|
||||||
|
$responseCode = $datosArray["result"]["error_id"];
|
||||||
|
http_response_code($responseCode);
|
||||||
|
}else{
|
||||||
|
http_response_code(200);
|
||||||
|
}
|
||||||
|
echo json_encode($datosArray);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$datosArray = $_respuestas->error_405();
|
$datosArray = $_respuestas->error_405();
|
||||||
|
Loading…
Reference in New Issue
Block a user