{
"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.
También puede interesarte:
Configurar Laravel Sail para utilizar un MySql externo existente |
||