Publicidad

3 - Crear una API en PHP, clases de validación y rutas


Por Alex el 29/05/2020 , Comentar el artículo

Comparte este artículo:        




En el anterior artículo vimos cómo estaba dividido el JSON, la estructura de las carpetas y los ficheros/clases que van a componer nuestra API. En este tercer artículo vamos a continuar con el desarrollo de la API añadiendo las funcionalidades de validación de datos y rutas de acciones a realizar.


Vamos a crear dos clases más que serán parte del core de nuestra API

  • libs/CoreClass.php, es la clase donde validamos los datos entrados, que vengan datos, que el JSON sea correcto, validamos si los usuarios tienen permisos correctos y en función de los atributos del JSON class y method se realizará una acción u otra, las rutas.
  • libs/LoginClass.php, es la clase donde validamos los datos que vienen en el atributo LOGIN, devolvemos un true si la validación es correcta y false si es hay error.

Y en el fichero index.php añadimos en la sección donde incluimos los ficheros necesarios estas dos clases nuevas:

  require_once dirname( dirname(__FILE__))."/libs/CoreClass.php";
require_once dirname( dirname(__FILE__))."/libs/LoginClass.php";
Y vamos a la línea 58-59 aproximadamente donde esta este código

  /*$_core = new CoreClass();
  $_core->Init ( $_data_input, $_data_server);*/
Ponemos estas otras líneas de código en su lugar

$_config = ConfigClass::get("database.cars");
  PDOClass2::Connection( $_config);

  $_core = new CoreClass();
  $_core->Init ( $_data_input, $_data_server);

  PDOClass2::Close();
Y ahora en la clase CoreClass.php creamos un nuevo método llamado init que será el punto de entrada a las funcionalidades de la API y donde validamos los datos recibidos y decidiremos si todo está correcto o devolvemos algún error.

Código de la función init de la clase CoreClass.php


# Si no nos envian información y salimos con mensaje de error
    if ( trim( $data_input) == "")
    {
      echo ("Error: no hay datos para procesar");
      die;
    }

    # Si el json no tiene el formato correcto devolvemos un error
    if ( !json_decode( $data_input))
    {
      echo ("Error: el JSON no tiene el formato correcto");
      die;
    }

     # Si todo esta validado seguimos con el proceso  y pasamos el json a un array php
    $data = json_decode( $data_input, true);


    $_login = new LoginClass();
    # Verificamos que el api user y el pass user son correctos y tienen permisos para utilizar
    # esta API
    $login_api = $_login->api_login( $data['LOGIN']);


    if ( !$login_api)
    {
      # Si la llamada a comprobar los datos de la API devuelve falso
      echo "La api no tiene permisos";
      die;
    }


    $_class = ucwords( trim( $data['ACTIONS']['class'] . "Class"));
    $_method = $data['ACTIONS']['method'];

    # Cargamos la clase (fichero) que vamos a utilizar dinamicamente
    $class_include = dirname( dirname(__FILE__))."/Modules/".$_class.".php";

    if ( file_exists( $class_include))
    {
        require $class_include;

        $action = new $_class();
        $return = $action->{$_method} ( $data);

        echo $return;

    }
    else
    {
      echo ( "\nClase '" . $class_include . " no existe");
      die;
    }


  }
CoreClass es la encargada de cargar los ficheros php que se van a ejecutar en cada petición a través de este código

En el atributo ACTIONS del Json le decimos que fichero (clase) y que método queremos ejecutar

$_class = ucwords( trim( $data['ACTIONS']['class'] . "Class"));
$_method = $data['ACTIONS]['method'];
Y a través del siguiente código se carga la clase y ejecuta el método

   # Cargamos la clase (fichero) que vamos a utilizar dinamicamente
    $class_include = dirname( dirname(__FILE__))."/Modules/".$_class.".php";

    if ( file_exists( $class_include))
    {
        require $class_include;
        
       # Carga la clase y ejecuta el metodo
        $action = new $_class();
        $return = $action->{$_method} ( $data);

        echo $return;
    }
Poca cosa que comentar de la clase LoginClass.php que está para validar usuario y contraseña de la API otros usuarios si quisiéramos poner mas validaciones o diferentes.

Desde la clase CoreClass le pasamos al método api_login los datos de acceso que vienen en el atributo LOGIN

public function api_login( $data)
  {

    # Validamos los datos de user y pass de la API con la tabla auth_sockets
    $params['query'] = "select id, token
                      from auth_env where api_user = ? And api_pass = ? And enabled = 1 And api_name = ?";
    $params['params'] = array( $data['username'], $data['password'], $data['api']);


    $rows = PDOClass2::ExecuteQuery( $params);

    if ( empty( $rows['data']))
    {

      echo "Error validando usarios de API";
      return (false);

    }

    return ( true);

  }

Y hasta aquí la estructura base de la API. Hemos definido la arquitectura de la API con los ficheros/clases que van a ser necesarios.

Ahora podemos probar la API. Podéis bajaros el código desde el github y probarlo https://github.com/depruebas/api-cars

Vais al directorio api-cars/api-cars-chapters/03/public del proyecto que os acabáis de bajar y ejecutáis el servidor web

php -S 127.0.0.1:8000


y ejecutáis el post

curl -X POST --header 'Content-Type: application/json' -d '{"LOGIN":{"username":"tEQUnCs5UdmGApjSksFkeBykC5ANVpns","password":"8A}yCehpvD5Pm26jtQZY-m;t5^G(WTd]","api":"CARS-DEV"},"ACTIONS":{"class":"List","method": "brands"},"DATA":{"params":""}}' http://127.0.0.1:8000


El resultado tiene que ser este:

Clase '/api-cars/api-cars-full/Modules/ListClass.php no existe


Da un error al no encontrar el fichero que quiere ejecutar, el fichero es ListClass.php que es el que pasamos en el atributo ACTIONS - class

Y esto es todo, y feliz programming
Saludos
Alex.



Si te ha gustado el artículo compartelo en:        


Publicidad


Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.