Publicidad

2 - Crear una API en PHP, añadiendo funcionalidades


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

Comparte este artículo:      




En este segundo artículo vamos a explicar el JSON que enviamos, a crear las funcionalidades completas del fichero index.php, la estructura de directorios y añadimos las clases auxiliares que necesitamos como configuraciones, bases de datos y control de errores.


El JSON que va a recibir nuestra API es el siguiente:

{
   "LOGIN":{
      "username":"tEQUnCs5UdmGApjSksFkeBykC5ANVpns",
      "password":"8A}yCehpvD5Pm26jtQZY-m;t5^G(WTd]",
      "api":"CARS-DEV"
   },
   "ACTIONS":{
      "class":"List",
      "method": "brands"
   },
   "DATA":{
"params":"" } }
El JSON que enviamos se compone de dos partes principales, los atributos

  • LOGIN, es la parte de autentificación de la API:
    • username: código para la API que está ejecutando llamada
    • password: contraseñaa de la API, asociada al username
    • api: nombre de la API, asociado al username y al passowd.
  • ACTIONS, es la parte donde enviamos lo que vamos hacer, a pedir a la API que ejecute una clase y un método concretos
    • class, la clase que va a cargarse en la API
    • method, el método que se ejecutará en la clase especificada anteriormente. Esto después lo vemos con más detalle.
  • DATA, este tercer atributo no es obligatorio y solo lo utilizaremos si tenemos que enviar parámetros a los métodos de la api

Archivos que componen la API

Si recordáis en el artículo anterior habíamos empezado con un directorio llamado api-cars y un fichero de entrada index.php. Ahora vamos a crear los subdirectorios necesarios para la API y las librerías que nos van hacer falta. La estructura nos quedará así:

  • config, donde pondremos los ficheros de configuración.
  • libs, las librerías comunes de la aplicación routeo, database, errores, etc.
  • logs, ficheros de log de errores y/o trazas.
  • modules, las clases que realizan acciones concretas con la API, clases específicas de la aplicación.
  • public, directorio público al que se accede desde internet, donde va el index.php

Dentro del directorio config pondremos los ficheros de configuración. En este ejemplo tendremos tres

  • config.php, datos de configuración general de la API.
  • database.php, datos de acceso a la bbdd.
  • messages.php, mensajes de todo tipo, tenerlos en un fichero ayuda a las traducciones.

Dentro del directorio libs pondremos las librerías que necesitaremos. En este ejemplo tendremos

  • ConfigClass.php, una librería para leer ficheros de configuración. Es una librería muy útil que encontré por internet y no recuerdo donde.
  • PDOClass2.php, librería para acceder a la bbdd.
  • CustomErrorLog.php, librería para gestionar y guardar en un fichero txt los errores que ocurren en la API.
  • Utils.php, es un fichero con funciones varias que pueden ser de utilidad a lo largo del programa.
  • CoreClass.php, clase donde pondremos la lógica de validaciones y acciones que va a realizar nuestra API.

Ya hemos explicado el JSON que enviamos y los ficheros que necesitamos para construir nuestra primera API, ahora vamos a codificar el fichero index.php con todo lo que necesitamos para que inicie correctamente y reciba datos.

A continuación os dejo el código de la página index.php comentado. Creo que los comentarios son suficientemente explicativos para leer bien el programa.

  # Iniciamos el timer para ver el tiempo que tarda la api en procesar una peticíon
  $start_time = microtime(true);


  # Guardamos la fecha con la que se inicia la API en cada petición, despues la utilizaremos en los
  # logs para saber cuando fue la petición
  global $init_time;
  $init_time = date( "Y-m-d H:i:s");


  # Incluimos los headers para que
  # el content-type y el cache ( no queremos que se cacheen los resultados )
  header('Content-Type: text/html; charset=utf-8');
  header('Cache-Control: no-cache');
  header('Cache-Control: no-store');
  header('Pragma: no-cache');


  # Añadimos las librerias .php que vamos a necesitar en la API
  require_once dirname( dirname(__FILE__))."/libs/ConfigClass.php";
  require_once dirname( dirname(__FILE__))."/libs/Utils.php";
  require_once dirname( dirname(__FILE__))."/libs/CustomErrorLog.php";
  require_once dirname( dirname(__FILE__))."/libs/PDOClass2.php";


  # Inicializamos CustomErrorLog, para procesar automaticamente los errores
  $e = new CustomErrorLog();


  # Defimos las costantes del programa
  define( 'DEBUG', ConfigClass::get("config.debug"));
  define( 'ENVIRONMENT', ConfigClass::get("config.environment"));
  define( "EOF", "\n");


  # Guardamos en un array de entrada los datos generales de la llamada:
  #   el metodo de llamada POST, GET, PUT ... etc ...
  #   la url que la llama
  #   la IP que la llama
  $_data_server = array(
    'method' => $_SERVER['REQUEST_METHOD'],
    'uri' => explode( "/", $_SERVER['REQUEST_URI']),
    'remote_ip' => $_SERVER['REMOTE_ADDR'],
  );

  # Punto de entrada de la API donde se reciben los datos del POST
  $_data_input = file_get_contents( 'php://input');

  # Guardamos los datos tal como vienen en una variable en la clase de errores por si se
  # produce un error saber que datos de entrada lo ha provcado
  $e->set_data( $_data_input);


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


  # Si tenemos la depuración activada se registra el tiempo que tarda en procesar las peticiones
  if ( DEBUG)
  {
    $time = microtime(true) - $start_time;

    if ( $time > 1)
    {
      # formatPeriod es una función que esta en el fichero Utils.php
      $time = formatPeriod( $time);
    }

    echo EOF.( $time ) . EOF;
  }

Podeis bajaros el codigo desde el github y probalo https://github.com/depruebas/api-cars

Vais al directorio api-cars/api-cars-chapters/02/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:

0.00012588500976562
FIN PROCESAR API.



Y con esto acabamos el segundo capítulo, en el tercer capítulo vamos a añadir más funcionalidades a la API el routing y el login con la bases de datos.

Y esto es todo, y feliz programming
Saludos
Alex.



Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.