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
|
||||
|
||||
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
|
||||
|
||||
[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
|
||||
```
|
||||
|
||||
`/etc/apache2/apache2.conf`
|
||||
Editar archivo de configuración de apache `sudoedit /etc/apache2/apache2.conf`
|
||||
|
||||
Agregar:
|
||||
|
||||
```apache
|
||||
<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).
|
||||
|
||||
Agregar la sgte. linea en `.htaccess`
|
||||
Agregar la sgte. linea en archivo [.htaccess](./apirest_yt/.htaccess)
|
||||
|
||||
```apache
|
||||
php_flag display_errors 1
|
||||
@ -81,7 +90,8 @@ display_errors = On
|
||||
|
||||
## 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`.
|
||||
|
||||
@ -99,11 +109,24 @@ Crear archivo de configuración en la ruta `./<projecto>/clases/conexion/config`
|
||||
|
||||
#### 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
|
||||
un `string` *hexadecimal*.
|
||||
un *string hexadecimal*.
|
||||
- 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)
|
||||
|
||||
#### 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';
|
||||
|
||||
class pacientes extends conexion{
|
||||
|
||||
private $table = "pacientes";
|
||||
private $pacienteid = "";
|
||||
private $dni = "";
|
||||
@ -14,12 +13,13 @@ class pacientes extends conexion{
|
||||
private $telefono = "";
|
||||
private $fecha_nacimiento = "0000-00-00";
|
||||
private $correo = "";
|
||||
|
||||
private $token = "";
|
||||
// 532c75dac0f7f4d311300302538ab49f
|
||||
|
||||
public function listaPacientes($pagina = 1){
|
||||
// paginador
|
||||
$inicio = 0;
|
||||
$cantidad = 100;
|
||||
$cantidad = 10;
|
||||
if ($pagina > 1){
|
||||
$inicio = ($cantidad * ($pagina - 1)) + 1;
|
||||
$cantidad = $cantidad * $pagina;
|
||||
@ -39,6 +39,14 @@ class pacientes extends conexion{
|
||||
public function post($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['nombre']) || !isset($datos['dni']) || !isset($datos['correo'])){
|
||||
return $_respuestas->error_400();
|
||||
} else {
|
||||
@ -61,6 +69,10 @@ class pacientes extends conexion{
|
||||
return $_respuestas->error_500();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return $_respuestas->error_401("Token inválido o caducado");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function insertarPaciente(){
|
||||
@ -80,6 +92,14 @@ class pacientes extends conexion{
|
||||
public function put($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 {
|
||||
@ -105,6 +125,10 @@ class pacientes extends conexion{
|
||||
return $_respuestas->error_500();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return $_respuestas->error_401("Token inválido o caducado");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
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;
|
||||
|
||||
#$conector->test_conector();
|
||||
|
||||
// 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 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>';
|
||||
?>
|
||||
<!-- 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);
|
||||
|
||||
} 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 {
|
||||
$datosArray = $_respuestas->error_405();
|
||||
|
Loading…
Reference in New Issue
Block a user