Ticker

6/recent/ticker-posts

CodeIgniter - Crear Web API RESTful

Hola espero estén super bien, en este tutorial práctico desarrollaremos una Aplicación Web CRUD haciendo uso del Framework PHP como es CodeIgniter, se implementará con la versión 3 haciendo uso de la bases de datos relacionales como MySQL.

Requisitos:

  1. XAMPP Control Panel.
  2. MySQL Workbench o phpMyAdmin.
  3. Visual Studio Code y Postman.
  4. CodeIgniter v3 (Framework PHP).
  5. REST Server (Recurso rest api tool).

Lo que veremos en este tutorial:

  1. Descargar CodeIgniter v3 y REST Server.
  2. Crear la base de datos en MySQL.
  3. Configurar archivos de la aplicación.
  4. Crear e implementar controlador.
  5. Crear e implementar modelo.
  6. Validar desde Postman.
  7. Conclusiones.

1. Descargar CodeIgniter v3 y REST Server.

Para la descarga del Framework CodeIgniter les sugiero descargar desde la pagina oficial, para este tutorial práctico estoy usando la versión 3.1.11. Además, se debe descargar el recurso de REST Server desde la pagina de gitlab para la versión de CodeIgniter v3.

Seguidamente se debe descomprimir el archivo y copiar los archivos en el directorio final donde se iniciará la implementación, en mi caso el directorio final es restfull-web-api.

Recuerda que debe COPIAR los archivos REST Server al directorio application de nuestro proyecto final de CodeIgniter .


2. Crear la base de datos en MySQL.

Crea la base de datos con el nombre de demo desde el Workbench o phpMyAdmin, seguidamente crea la tabla user con la siguiente estructura:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
--
-- Estructura de tabla para la tabla `user`
-- CREATE TABLE `user` ( `id` int(11) NOT NULL, `first_name` varchar(255) NOT NULL, `last_name` varchar(255) NOT NULL, `user` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- PRIMARY KEY de la tabla `user`
-- ALTER TABLE `user`
ADD PRIMARY KEY (`id`);

Seguidamente ingresamos al menos un registro desde la sentencia DML insert de SQL:

1
INSERT INTO `user` (`id`, `first_name`, `last_name`, `user`, `password`, `email`) VALUES (1, 'Hadson', 'Paredes', 'hadson', '123@a', 'hadson1@gmail.com');


3. Configurar archivos de la aplicación.

Configurar la conexión a la base de datos en el archivo database.php ..\application\config\database.php

1
2
3
4
5
	'hostname' => 'localhost',
	'username' => 'root',
	'password' => '',
	'database' => 'demo',
	'dbdriver' => 'mysqli',

4. Crear e implementar controlador.

Crear el controlador Api.php

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
/** access library REST_Controller, remember is library is a REST Server resource*/
require APPPATH . 'libraries/REST_Controller.php';

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");

class Api extends REST_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('User_model', 'use');        
    }

    public function index_get()
    {
        $id = $this->input->get('id');

        if(!empty($id)) {

            $data = $this->use->get_by_id($id)->result();

            if($data) {
                $res['error'] = false;
                $res['message'] = 'success get data by id';
                $res['data'] = $data;    
                
            }else {
                $res['error'] = true;
                $res['message'] = 'failed get data';
            }

        }else {

            $data = $this->use->get_all()->result();

            if($data) {
                $res['error'] = false;
                $res['message'] = 'success get all data';
                $res['data'] = $data;

            } else {
                $res['error'] = true;
                $res['message'] = 'failed get data';
            }

        }
        $this->response($res, 200);        
    }

    public function index_post()
    {
        $id = $this->input->post('id');
        $first_name = $this->input->post('first_name');
        $last_name = $this->input->post('last_name');
        $user = $this->input->post('user');
        $password = $this->input->post('password');
        $email = $this->input->post('email');

        $data = array(
            'id' => $id,
            'first_name' => $first_name,
            'last_name' => $last_name,
            'user' => $user,
            'password' => $password,
            'email' => $email
        );

        $insert = $this->use->save($data);

        if($insert) {
            $res['error'] = false;
            $res['message'] = 'insert success';
            $res['data'] = $data;
        } else {
            $res['error'] = true;
            $res['message'] = 'insert failed';
            $res['data'] = null;
        }

        $this->response($res, 200);        
    }

    public function index_put()
    {
        $id = $this->input->get('id');

        $first_name = $this->put('first_name');
        $last_name = $this->put('last_name');
        $user = $this->put('user');
        $password = $this->put('password');
        $email = $this->put('email');

        $data = array(
            'first_name' => $first_name,
            'last_name' => $last_name,
            'user' => $user,
            'password' => $password,
            'email' => $email
        );

        if(!empty($id)) {
           $update = $this->use->edit($id, $data);

           if($update) {
                $res['error'] = false;
                $res['message'] = 'update success';
                $res['data'] = $data;
           } else {
                $res['error'] = true;
                $res['message'] = 'update failed';
                $res['data'] = null;
           }
        } else {
            $res['error'] = true;
            $res['message'] = 'update failed';
            $res['data'] = null;
        }

        $this->response($res, 200);        
    }

    public function index_delete()
    {
        $id = $this->input->get('id');

        if(!empty($id)) {

            $delete = $this->use->delete($id);

            if($delete) {
                $res['error'] = false;
                $res['message'] = 'delete success';
                
           } else {
                $res['error'] = true;
                $res['message'] = 'delete failed';
                
           }
        } else {
            $res['error'] = true;
            $res['message'] = 'delete failed';
        }

        $this->response($res, 200);        
    }
}

5. Crear e implementar modelo.

Crear el controlador User_model.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php 
defined('BASEPATH') OR exit('No direct script access allowed');

class User_model extends CI_Model {
    
    public function __construct(){
		parent::__construct();
		$this->load->database();
	}

    /** Implement function get_all for get all rows  our user table */
    public function get_all()
    {
        //$this->db->limit($start, $page_size);
        $q = $this->db->get('user');
        return $q;        
    }

    /** Implement function get_by_id for get row with id our user table */
    public function get_by_id($id)
    {        
        $q = $this->db->get_where("user", ['id' => $id]);
        return $q;
    }

    public function save($data)
    {     
        return $this->db->insert('user', $data);        
    }

    public function edit($id, $data)
    {        
        $this->db->where('id', $id);
        return $this->db->update('user', $data);        
    }

    public function delete($id)
    {        
        $this->db->where('id', $id);        
       return $this->db->delete('user');        
    }
}


6. Validar desde Postman.


Validar los verbos Http REST desde Postman en tiene relación con las funciones implementadas en nuestro controlador Api.php.

Verbo GET se relaciona con la función index_get


Datos recuperados que fueron insertados desde la sentencia DML INSERT

Verbo POST se relaciona con la función index_post


Seleccionar POST, Body y Axtivar x-www-from-urlencoded e ingresar los valores para realizar la INSERCIÓN a la base de datos.

Resultados del proceso POST


Volver a validar el Verbo GET en base al registro ingresado posteriormente

Agrega el parámetro id=2 a la url de la web api



Verbo PUT se relaciona con la función index_put

Se actualiza el registros password considerando el parámetro o filtro id=2 a la url de la web api


Resultado del dato actualizado


Verbo DELETE se relaciona con la función index_delete


Se elimina el registro que se ingreso y actualizo anteriormente, considerando el parámetro o filtro id=2 a la url de la web api.


7. Conclusiones

Este ejemplo práctico se elaboro una Web API RESTful con CodeIgniter con la versión 3 con el apoyo del recurso REST Server  haciendo uso de la base de datos relacional MySQL; asimismo, se validaron todos las funciones desarrolladas desde Postman; como punto adicional recordarle que el uso de las web api nos permiten habilitar el acceso a sus determinado recursos y al mismo tiempo brinda la facilidad de poder extender la funcionalidad de su implementación sin importar el tipo de desarrollo (web, mobile nativo o híbridos), además nos ofrece la seguridad y el control según el tipo de enfoque que se desea usar.

Disponible en GitHub


Gracias nuevamente 😊; comentarios y apreciaciones son bienvenido, un fuerte abrazo para todos ✌...!!!

Publicar un comentario

1 Comentarios

  1. Como coloco un token de autentificar para la api, para que sea privada

    ResponderBorrar