{"id":3359,"date":"2022-01-06T23:33:42","date_gmt":"2022-01-07T05:33:42","guid":{"rendered":"https:\/\/linuxitos.com\/main\/?p=3359"},"modified":"2022-11-20T12:29:13","modified_gmt":"2022-11-20T18:29:13","slug":"rest-api-en-codeigniter-4","status":"publish","type":"post","link":"https:\/\/linuxitos.com\/main\/rest-api-en-codeigniter-4\/","title":{"rendered":"REST API en CodeIgniter 4"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/download.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/download.jpeg\" alt=\"\" class=\"wp-image-3362\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/download.jpeg 1024w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/download-300x150.jpeg 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/download-768x384.jpeg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Introducci\u00f3n<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">REST API es una implementaci\u00f3n de la API (Application Programming Interface) y por otro lado REST por sus siglas en ingl\u00e9s (REpresentational State Transfer) es una arquitectura de m\u00e9todo de comunicaci\u00f3n que utiliza el protocolo HTTP para el intercambio de datos y este m\u00e9todo se aplica a menudo en el desarrollo de aplicaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puede parecer complicado, pero no lo es, s\u00f3lo hay que ser un poco atentos y leer bien lo que prosigue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El objetivo es hacer un sistema con buen rendimiento, r\u00e1pido y f\u00e1cil de desarrollar, especialmente en el intercambio de datos y la comunicaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 usar un REST API?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><br>Si se observa la arquitectura tradicional de comunicaci\u00f3n de datos entre el cliente y el servidor se parece a la siguiente imagen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"598\" height=\"122\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-1.png\" alt=\"\" class=\"wp-image-3363\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-1.png 598w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-1-300x61.png 300w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Donde el cliente env\u00eda una solicitud al servidor a trav\u00e9s de HTTP Request, y el servidor proporciona una respuesta a trav\u00e9s de HTTP Response.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La respuesta la da el servidor, normalmente en formato HTML. Sin embargo, Imagina que tienes que desarrollar tu sitio web en una aplicaci\u00f3n m\u00f3vil como Android o iOS. Y se sabe que tanto las aplicaciones de Android como de iOS no necesitan HTML como respuesta del servidor, porque Android e iOS utilizan diferentes lenguajes de programaci\u00f3n y no reconocen HTML. Por lo tanto, tenemos que crear una API RESTful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De tal forma, que RESTful API ser\u00e1 un puente de comunicaci\u00f3n de datos entre el cliente y el servidor. As\u00ed, el servidor ya no env\u00eda HTML como respuesta, sino s\u00f3lo datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00ed, as\u00ed es, s\u00f3lo datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta respuesta en forma de datos se puede utilizar para varias plataformas de aplicaciones con diferentes lenguajes de programaci\u00f3n. La respuesta de la API suele estar en formato JSON o XML. Sin embargo, el m\u00e1s utilizado es JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este tutorial, se crear\u00e1 una API REST con datos de respuesta en formato JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mira la siguiente imagen para entender mejor la arquitectura de la API REST:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-2-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"863\" height=\"620\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-2-1.png\" alt=\"\" class=\"wp-image-3364\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-2-1.png 863w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-2-1-300x216.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/image-2-1-768x552.png 768w\" sizes=\"auto, (max-width: 863px) 100vw, 863px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Donde los clientes pueden ser de varias plataformas, como aplicaciones web, de escritorio o m\u00f3viles. Eso suena m\u00e1s factible, correcto?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 1. Dise\u00f1ar la API REST<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de crear una API REST, es una buena idea definir el EndPoint de la API REST que se va a crear. El EndPoint son las rutas de la API que vamos a crear.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">API REST utilizando <strong>verbs<\/strong> HTTP. Los verbos HTTP m\u00e1s utilizados son <strong>GET, POST, PUT y DELETE<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>GET<\/strong> para obtener datos del servidor o m\u00e1s conocido como <strong>READ<\/strong>, <strong>POST<\/strong> para <strong>CREAR<\/strong> nuevos datos, <strong>PUT<\/strong> para <strong>UPDATE<\/strong> (actualizar) datos, y <strong>DELETE<\/strong> para eliminar datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O mejor conocido como <strong>CRUD<\/strong> (<strong>Create-Read-Update-Delete<\/strong>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este tutorial, compartir c\u00f3mo crear una sencilla API REST para recuperar datos del servidor (<strong>GET<\/strong>), crear nuevos datos al servidor (<strong>POST<\/strong>), actualizar datos al servidor (PUT), y borrar datos al servidor (<strong>DELETE<\/strong>) de una tabla de la base de datos, concretamente la tabla \u00ab<strong>product<\/strong>\u00ab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n se muestra el dise\u00f1o de la API REST que vamos a crear:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"221\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1024x221.png\" alt=\"\" class=\"wp-image-3389\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1024x221.png 1024w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-300x65.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-768x165.png 768w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 2. Crear una base de datos y una tabla<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crear una nueva base de datos con MySQL, puedes utilizar herramientas como PHPMyAdmin u otras similares. En este ejemplo, se us\u00f3 phpMyAdmin con DBeaver como cliente<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Crear la base de datos con el nombre de \u00ab<strong>restful_db<\/strong>\u00bb o el nombre que consideren necesario.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para crear una base de datos con MySQL, se puede hacer ejecutando la siguiente consulta:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">CREATE DATABASE restful_db;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Crear la tabla \u00ab<strong>product<\/strong>\u00bb con la siguiente instrucci\u00f3n:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">CREATE TABLE product(\n\tproduct_id INT(11) PRIMARY KEY AUTO_INCREMENT,\n\tproduct_name VARCHAR(200),\n\tproduct_price DOUBLE\n)ENGINE=INNODB;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Insertar datos de pruebas:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">INSERT INTO product(product_name,product_price) VALUES\n('Product 1','2000'),\n('Product 2','5000'),\n('Product 3','4000'),\n('Product 4','6000'),\n('Product 5','7000');<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Paso #3. Instalaci\u00f3n de CodeIgniter 4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9ste tutorial utiliz\u00f3 las siguientes caracter\u00edsticas y software:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fedora 35 x86_64<\/li>\n\n\n\n<li>XAMPP 8.1.1<\/li>\n\n\n\n<li>Codeigniter 4.1.6<\/li>\n\n\n\n<li>MariaDB<\/li>\n\n\n\n<li>DBeaver<\/li>\n\n\n\n<li>Postman<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Crear proyecto CodeIgniter 4 desde composer, con la siguiente l\u00ednea:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">composer create-project codeigniter4\/appstarter restfulapi<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9ste proyecto se crear\u00e1 en la ruta de su servidor PHP, en \u00e9ste ejemplo, se us\u00f3 XAMPP 8.1.1. Pero pueden usar cualquier otro servidor de prueba, como WAMPP, LAMPP \u00f3 AMPP<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">cd restfulapi<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 4. Conectar con la base de datos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abrir el archivo \u00ab<strong>Database.php<\/strong>\u00bb ubicado en la carpeta \u00ab<strong>app\/Config<\/strong>\u00ab, luego encuentre el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public $default = &#91;\n        'DSN'      =&gt; '',\n        'hostname' =&gt; 'localhost',\n        'username' =&gt; '',\n        'password' =&gt; '',\n        'database' =&gt; '',\n        'DBDriver' =&gt; 'MySQLi',\n        'DBPrefix' =&gt; '',\n        'pConnect' =&gt; false,\n        'DBDebug'  =&gt; (ENVIRONMENT !== 'production'),\n        'charset'  =&gt; 'utf8',\n        'DBCollat' =&gt; 'utf8_general_ci',\n        'swapPre'  =&gt; '',\n        'encrypt'  =&gt; false,\n        'compress' =&gt; false,\n        'strictOn' =&gt; false,\n        'failover' =&gt; &#91;],\n        'port'     =&gt; 3306,\n];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Modificar los accesos respectivamente, con los datos de conexi\u00f3n<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public $default = &#91;\n    'DSN'      =&gt; '',\n    'hostname' =&gt; 'localhost',\n    'username' =&gt; 'root',\n    'password' =&gt; '',\n    'database' =&gt; 'restful_db',\n    'DBDriver' =&gt; 'MySQLi',\n    'DBPrefix' =&gt; '',\n    'pConnect' =&gt; false,\n    'DBDebug'  =&gt; (ENVIRONMENT !== 'production'),\n    'cacheOn'  =&gt; false,\n    'cacheDir' =&gt; '',\n    'charset'  =&gt; 'utf8',\n    'DBCollat' =&gt; 'utf8_general_ci',\n    'swapPre'  =&gt; '',\n    'encrypt'  =&gt; false,\n    'compress' =&gt; false,\n    'strictOn' =&gt; false,\n    'failover' =&gt; &#91;],\n    'port'     =&gt; 3306,\n];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si por alguna raz\u00f3n, hay problemas en la conexi\u00f3n con el siguiente mensaje de error:<\/p>\n\n\n\n<pre style=\"background: rgba(255, 231, 240, 0.98823529411764707); border-radius: 6px; border: 1px solid #ee0c74; color:#ee0c74; box-sizing: border-box; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">CodeIgniter\\Database\\Exceptions\\DatabaseException #8\nUnable to connect database : Codeigniter<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si se obtiene ese  error Codeigniter &#8211; no puede conectarse a la base de datos MySQL, entonces se debe cambiar el valor del nombre de host basado en el servidor local que se est\u00e9 usando, por ejemplo MAMPP o XAMPP.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># MAMPP\npublic $default = &#91;\n  ...\n     'hostname' =&gt; '\/Applications\/MAMP\/tmp\/mysql\/mysql.sock',\n  ...\n]\n\n# XAMPP\npublic $default = &#91;\n  ...\n     'hostname' =&gt; '\/Applications\/XAMPP\/xamppfiles\/var\/mysql\/mysql.sock',\n  ...\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para que se tenga una buena interfaz para manejar los errores, encontrar el archivo <strong>env<\/strong> en la ra\u00edz del proyecto, ren\u00f3mbralo a <strong>.env<\/strong> y \u00e1brelo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Luego encuentra el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">CI_ENVIRONMENT = development<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto significa que entra en el modo de desarrollo, este modo le ayudar\u00e1 a hacer m\u00e1s f\u00e1cil el seguimiento de los errores a medida que construye su proyecto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso #5. Crear un archivo de modelo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crear un archivo modelo llamado \u00ab<strong>ProductModel.ph<\/strong>p\u00bb en la carpeta \u00abapp\/Models\u00bb, y luego escriba el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nnamespace App\\Models;\n\nuse CodeIgniter\\Model;\n\nclass ProductModel extends Model\n{\n    protected $table = 'product';\n    protected $primaryKey = 'product_id';\n    protected $allowedFields = &#91;'product_name','product_price'];\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 6. Crear un archivo controlador<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crear un archivo controlador llamado \u00ab<strong>Products.php<\/strong>\u00bb en la carpeta \u00abapp\/Controllers\u00bb, luego escriba el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nnamespace App\\Controllers;\n \nuse CodeIgniter\\RESTful\\ResourceController;\nuse CodeIgniter\\API\\ResponseTrait;\nuse App\\Models\\ProductModel;\n\nclass Products extends ResourceController\n{\n    use ResponseTrait;\n    \/\/ get all product\n    public function index()\n    {\n        $model = new ProductModel();\n        $data = $model-&gt;findAll();\n        return $this-&gt;respond($data, 200);\n    }\n \n    \/\/ get single product\n    public function show($id = null)\n    {\n        $model = new ProductModel();\n        $data = $model-&gt;getWhere(&#91;'product_id' =&gt; $id])-&gt;getResult();\n        if($data){\n            return $this-&gt;respond($data);\n        }else{\n            return $this-&gt;failNotFound('No Data Found with id '.$id);\n        }\n    }\n \n    \/\/ create a product\n    public function create()\n    {\n        $model = new ProductModel();\n        $data = &#91;\n            'product_name' =&gt; $this-&gt;request-&gt;getPost('product_name'),\n            'product_price' =&gt; $this-&gt;request-&gt;getPost('product_price')\n        ];\n        $model-&gt;insert($data);\n        $response = &#91;\n            'status'   =&gt; 201,\n            'error'    =&gt; null,\n            'messages' =&gt; &#91;\n                'success' =&gt; 'Data Saved'\n            ]\n        ];\n         \n        return $this-&gt;respondCreated($data, 201);\n    }\n \n    \/\/ update product\n    public function update($id = null)\n    {\n        $model = new ProductModel();\n        $json = $this-&gt;request-&gt;getJSON();\n        if($json){\n            $data = &#91;\n                'product_name' =&gt; $json-&gt;product_name,\n                'product_price' =&gt; $json-&gt;product_price\n            ];\n        }else{\n            $input = $this-&gt;request-&gt;getRawInput();\n            $data = &#91;\n                'product_name' =&gt; $input&#91;'product_name'],\n                'product_price' =&gt; $input&#91;'product_price']\n            ];\n        }\n        \/\/ Insert to Database\n        $model-&gt;update($id, $data);\n        $response = &#91;\n            'status'   =&gt; 200,\n            'error'    =&gt; null,\n            'messages' =&gt; &#91;\n                'success' =&gt; 'Data Updated'\n            ]\n        ];\n        return $this-&gt;respond($response);\n    }\n\n    \/\/ delete product\n    public function delete($id = null)\n    {\n        $model = new ProductModel();\n        $data = $model-&gt;find($id);\n        if($data){\n            $model-&gt;delete($id);\n            $response = &#91;\n                'status'   =&gt; 200,\n                'error'    =&gt; null,\n                'messages' =&gt; &#91;\n                    'success' =&gt; 'Data Deleted'\n                ]\n            ];\n            return $this-&gt;respondDeleted($response);\n        }else{\n            return $this-&gt;failNotFound('No Data Found with id '.$id);\n        }    \n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">CodeIgniter 4 ha facilitado a los desarrolladores web la creaci\u00f3n de API REST.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se puede ver en el controlador \u00ab<strong>Products.php<\/strong>\u00bb de arriba, con s\u00f3lo extender \u00ab<strong>ResourceController<\/strong>\u00bb podemos crear una \u00abAPI REST\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Y no s\u00f3lo eso, tambi\u00e9n podemos crear f\u00e1cilmente respuestas utilizando el \u00abAPI ResponseTrait\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso #7. Configuraci\u00f3n de Routes.php<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El \u00faltimo paso que no es menos importante es hacer una peque\u00f1a configuraci\u00f3n en el archivo \u00ab<strong>Routes.php<\/strong>\u00bb ubicado en la carpeta \u00ab<strong>app\/Config<\/strong>\u00ab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abrir el archivo \u00ab<strong>Routes.php<\/strong>\u00bb en la carpeta \u00ab<strong>app\/Config<\/strong>\u00ab, luego encuentre el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$routes-&gt;get('\/', 'Home::index');<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cambiarlo a \u00e9sta l\u00ednea:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$routes-&gt;resource('productos');<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta configuraci\u00f3n permite acceder al siguiente EndPoint:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"221\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1-1024x221.png\" alt=\"\" class=\"wp-image-3390\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1-1024x221.png 1024w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1-300x65.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1-768x165.png 768w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-49-44-1.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 8. Habilitar CORS (Cross-Origin Resources Sharing)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><br><strong>Esto es importante. <\/strong>Para que se pueda acceder a los recursos fuera del dominio, es necesario habilitar <strong>CORS<\/strong>. Para habilitar <strong>CORS<\/strong>, crear un archivo llamado \u00ab<em><strong>Cors.php<\/strong><\/em>\u00bb en la carpeta \u00ab<strong>app\/Filters<\/strong>\u00ab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Luego agregar el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nnamespace App\\Filters;\n\nuse CodeIgniter\\HTTP\\RequestInterface;\nuse CodeIgniter\\HTTP\\ResponseInterface;\nuse CodeIgniter\\Filters\\FilterInterface;\n\nClass Cors implements FilterInterface\n{\n    public function before(RequestInterface $request, $arguments = null)\n    {\n        header('Access-Control-Allow-Origin: *');\n        header(\"Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Authorization\");\n        header(\"Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE\");\n        $method = $_SERVER&#91;'REQUEST_METHOD'];\n        if ($method == \"OPTIONS\") {\n            die();\n        }\n    }\n \n    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)\n    {\n      \/\/ Do something here\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Abrir el archivo \u00ab<strong>Filters.php<\/strong>\u00bb en la carpeta \u00ab<strong>app\/Config<\/strong>\u00ab. A continuaci\u00f3n, buscar el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public $aliases = &#91;\n    'csrf'     =&gt; \\CodeIgniter\\Filters\\CSRF::class,\n    'toolbar'  =&gt; \\CodeIgniter\\Filters\\DebugToolbar::class,\n    'honeypot' =&gt; \\CodeIgniter\\Filters\\Honeypot::class,\n];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, a\u00f1adir un filtro \u00ab<strong>cors<\/strong>\u00bb de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public $aliases = &#91;\n   'csrf'     =&gt; \\CodeIgniter\\Filters\\CSRF::class,\n   'toolbar'  =&gt; \\CodeIgniter\\Filters\\DebugToolbar::class,\n   'honeypot' =&gt; \\CodeIgniter\\Filters\\Honeypot::class,\n   'cors'     =&gt; \\App\\Filters\\Cors::class, \n];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, definir \u00ab<strong>cors<\/strong>\u00bb en <strong>$globals <\/strong>p\u00fablico como sigue:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public $globals = &#91;\n    'before' =&gt; &#91;\n        'cors'\n        \/\/'honeypot'\n        \/\/ 'csrf',\n    ],\n    'after'  =&gt; &#91;\n        'toolbar',\n        \/\/'honeypot'\n    ],\n];<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 9. Probar el proyecto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><br>Para probar la API que se ha creado, hay muchas herramientas que se pueden utilizar. En este tutorial, se us\u00f3 POSTMAN.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Descargar POSTMAN en el sitio web oficial:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><a href=\"https:\/\/www.getpostman.com\/\">https:\/\/www.getpostman.com\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instalar postman puede ser mediante el paquete de descarga y ejecutarlo, o bien, desde la tienda de software de Fedora<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El proyecto se puede descargar de aqu\u00ed, en caso de querer descargarlo:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><a href=\"https:\/\/github.com\/jesusferm\/Codeigniter4-REST-API\">https:\/\/github.com\/jesusferm\/Codeigniter4-REST-API<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 10. Ejecuci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para iniciar el proyecto, ejecutar el siguiente comando:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">php spark serve<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-03-43.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"398\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-03-43-1024x398.png\" alt=\"\" class=\"wp-image-3378\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-03-43-1024x398.png 1024w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-03-43-300x117.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-03-43-768x298.png 768w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Screenshot-from-2022-01-06-22-03-43.png 1035w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">1. Obtener todos los productos (GET)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Abrir POSTMAN, y escribir la siguiente URL en el campo URL de Postman:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/localhost:8080\/products\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:8080\/products<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seleccionar el m\u00e9todo GET, luego clic en el bot\u00f3n Send, entonces los resultados aparecer\u00e1n como se muestra a continuaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"931\" height=\"573\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-6.png\" alt=\"\" class=\"wp-image-3380\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-6.png 931w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-6-300x185.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-6-768x473.png 768w\" sizes=\"auto, (max-width: 931px) 100vw, 931px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si al ejecutar la sentencia, los datos se recuperan, entonces todo va bien.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.- Obtener un solo producto (GET)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Escribir la siguiente URL en la columna URL para obtener un solo producto:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/localhost:8080\/products\/12\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:8080\/products\/12<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seleccionar el m\u00e9todo GET, luego haga clic en el bot\u00f3n Send, entonces los resultados aparecer\u00e1n como se muestra a continuaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"868\" height=\"336\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-7.png\" alt=\"\" class=\"wp-image-3381\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-7.png 868w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-7-300x116.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-7-768x297.png 768w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si con el id 12 no hay datos, corregir a uno que s\u00ed est\u00e9 registrado en la base de datos<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Crear un nuevo producto (POST)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Escribir la siguiente URL en la columna URL para crear un nuevo producto:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">http:\/\/localhost:8080\/products<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seleccionar el m\u00e9todo POST =&gt; Body =&gt; form-urlencoded =&gt; Introduzca KEY y VALUE =&gt; clic en Send.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como la siguiente imagen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-8.png\"><img loading=\"lazy\" decoding=\"async\" width=\"859\" height=\"516\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-8.png\" alt=\"\" class=\"wp-image-3382\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-8.png 859w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-8-300x180.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-8-768x461.png 768w\" sizes=\"auto, (max-width: 859px) 100vw, 859px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si se obtiene una respuesta con el estado 201 como se muestra arriba, los datos se han almacenado con \u00e9xito en la base de datos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Actualizar producto (PUT)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Escribir la siguiente URL en la columna URL para actualizar el producto:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/localhost:8080\/products\/12\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:8080\/products\/12<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seleccionar el m\u00e9todo PUT =&gt; Body =&gt; form-urlencoded =&gt; Introduzca KEY y VALUE =&gt; clic en Send.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como la siguiente imagen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"536\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-9.png\" alt=\"\" class=\"wp-image-3384\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-9.png 857w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-9-300x188.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-9-768x480.png 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si se obtiene una respuesta de estado 200 como se muestra arriba, los datos se han actualizado con \u00e9xito en la base de datos seg\u00fan el id de producto actualizado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Eliminar un producto (DELETE)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Escribir la siguiente URL en el campo URL para eliminar el producto:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/localhost:8080\/products\/13\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:8080\/products\/13<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seleccionar el m\u00e9todo DELETE y clic en Enviar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como en la siguiente imagen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-10.png\"><img loading=\"lazy\" decoding=\"async\" width=\"858\" height=\"305\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-10.png\" alt=\"\" class=\"wp-image-3385\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-10.png 858w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-10-300x107.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2022\/01\/Image-10-768x273.png 768w\" sizes=\"auto, (max-width: 858px) 100vw, 858px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si obtiene una respuesta de estado 200 como se muestra arriba, los datos se han eliminado con \u00e9xito en la base de datos.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusi\u00f3n<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed finaliza la codificaci\u00f3n y ahora, a probarlo, pueden descargar el proyecto de github, sin problema alguno.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fuentes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/mfikri.com\/en\/blog\/codeigniter4-restful-api\">https:\/\/mfikri.com\/en\/blog\/codeigniter4-restful-api<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.cloudways.com\/blog\/rest-api-in-codeigniter\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.cloudways.com\/blog\/rest-api-in-codeigniter\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.positronx.io\/codeigniter-rest-api-tutorial-with-example\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.positronx.io\/codeigniter-rest-api-tutorial-with-example\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/remotestack.io\/codeigniter-rest-api-development-example-tutorial\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/remotestack.io\/codeigniter-rest-api-development-example-tutorial\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n REST API es una implementaci\u00f3n de la API (Application Programming Interface) y por otro lado REST por sus siglas en ingl\u00e9s (REpresentational State Transfer) es una arquitectura de m\u00e9todo de comunicaci\u00f3n que utiliza el protocolo HTTP para el intercambio de datos y este m\u00e9todo se aplica a menudo en el desarrollo de aplicaciones. Puede [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3362,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,137,929,1511],"tags":[1633,1806,1804,1805],"class_list":["post-3359","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fedora","category-mariadb","category-mysql-server","category-server","tag-codeigniter","tag-creat-api","tag-rest-api","tag-restful"],"_links":{"self":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/3359","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/comments?post=3359"}],"version-history":[{"count":20,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/3359\/revisions"}],"predecessor-version":[{"id":3771,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/3359\/revisions\/3771"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media\/3362"}],"wp:attachment":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media?parent=3359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/categories?post=3359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/tags?post=3359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}