Como crear un API para registrar usuarios

Si tienes pensado programar una app en Xamarin o C# debes poder registrar, eliminar o modificar datos etc y por motivos de seguridad no debes hacerlo directamente desde tu app en una base de datos, debes usar un API y que sea ella quien se conecte a la bbdd.

Hay diferentes opciones que tienes a tu disposición para hacer eso, ya sea usando base de datos firebase en la nube, o una base de datos SQL en local, etc.

En esta ocasión yo tenia el típico hosting contratado con diferentes páginas web en php con bases de datos ilimitadas así que pensé, ¿por que no usar una base de datos mysql alojada en remoto?

Hoy os enseñaré cómo crear un API para registrar usuarios y poder conectarla con tu app xamarin.

Obviamente si tu intención no es crear y eliminar usuarios sino libros, cd, o lo que sea, será muy fácil modificarlo para que se adapte a tus necesidades.

Como el hosting es un cpanel con php instalado, el API que vamos a hacer será en php. Recordar que este api lo único que va a hacer es conectarse con la base de datos del servidor para crear, modificar o eliminar registros, así que no importa el lenguaje que se use.

Preparar base de datos

Esta parte es la más fácil y no creo que necesite mucha explicación así que hablaremos de ella por encima.

Entraremos en nuestro cpanel o plesk, habrá una sección para las base de datos y crearemos una base de datos dándole un nombre y contraseña.

Base de datos de CPANEL
Crear base de datos para el API

Después tendremos que crear un usuario que será el que se conecte a esa base de datos así que tendréis que darle todos los privilegios y recordar decirle a que base de datos va a poder acceder.

Añadir usuario de la base de datos

Una vez tengamos la base de datos podremos entrar desde PhpMyAdmin y crearemos las tablas que necesitemos, en mi caso como quiero un sistema de usuarios crearé la tabla con nombre «usuarios«

Ya solo quedará crear los campos que necesitemos, yo usaré los campos Id, Nombre, Apellidos, Email y Password. ( y más adelante crearé otro para la FOTO).

Código php para conectar la base de datos

Ya tenemos la base de datos lista ahora necesitamos lo importante el código PHP para poder conectar la api a la base de datos:

<?php

class DB{
    private $host;
    private $db;
    private $user;
    private $password;
    private $charset;

    public function __construct(){
        $this->host     = 'localhost';
        $this->db       = 'nombreDeTuBaseDeDatos';
        $this->user     = 'usuarioDeTuBaseDeDatos';
        $this->password = "contraseñaDeTuBaseDeDatos";
        $this->charset  = 'utf8';
    }

    function connect(){
    
        try{
            
            $connection = "mysql:host=".$this->host.";dbname=" . $this->db . ";charset=" . $this->charset;
            $options = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            $pdo = new PDO($connection,$this->user,$this->password);
       
            return $pdo;


        }catch(PDOException $e){
            print_r('Error connection: ' . $e->getMessage());
        }   
    }
}
?>

En el código creamos nuestras variables privadas y en el constructor le asignamos los valores que metimos antes al crear la base de datos, su nombre, el usuario con privilegios para acceder a la base de datos y su contraseña. ( ojo! la contraseña del usuario).

Te aconsejo copiar este código en un archivo php por ejemplo llamado db.php.

Crear la clase usuarios

Ahora es el momento de crear la clase usuario y va a heredar la clase db que hemos creado antes, veamos el código.

<?php

include_once 'db.php';

class Usuarios extends DB{
    
    function obtenerUsuarios(){

        $query = $this->connect()->query('SELECT * FROM usuarios');
        return $query;
    }

    function obtenerUsuario($id){
        $query = $this->connect()->prepare('SELECT * FROM usuarios WHERE id = :id');
        $query->execute(['id' => $id]);
        return $query;
    }
    function obtenerUsuarioEmail($email){
        $query = $this->connect()->prepare('SELECT * FROM usuarios WHERE email = :email');
        $query->execute(['email' => $email]);
        return $query;
    }

    function nuevoUsuario($usuario){
        $query = $this->connect()->prepare('INSERT INTO usuarios (nombre,ape,email,pass) VALUES (:nombre,:ape,:email,:pass)');
        $query->execute([
            'nombre' => $usuario["nombre"],
            'ape' => $usuario["ape"],
            'email' => $usuario["email"],
            'pass' => $usuario["pass"]
        ]);
        return $query;
    }
}

?>

Lo primero importamos la clase DB y creamos la clase Usuarios, y dentro creamos las funciones que vamos a necesitar.

En mi caso necesito:

  • Obtener todos los usuarios.
  • Obtener un usuario por tu número de ID
  • Obtener un usuario concreto pasándole su email.
  • Crear un nuevo usuario.

De momento voy a crear solo estas cuatro funciones, pero obviamente tu podrás crear los que necesites.

Fijaros como dentro de cada una de mis funciones uso la solicitud «Select * From usuarios Where….»

Recordar que si vuestra tabla no se llama Usuarios como la mía debéis cambiar esto, y si en vez de usar el campo email, usáis otro como por ejemplo DNI, deberéis cambiarlo.

También tengo que comentar que en la última función uso la llamada:

INSERT INTO usuarios (nombre,ape,email,pass) VALUES (:nombre,:ape,:email,:pass);

Esto viene a ser » Insértame dentro de la tabla llamada usuarios en los campos Nombre, Apellido, Email y Pass los valores «pepe», «guitierrez»,»pepegutierrez@gmail.com»,»contr@s3ñ@». «

Obviamente si tu usas otros campos deberás cambiar todo esto con los nombres de tus campos.

Todo este código lo metemos en un archivo llamado usuarios.php

Archivo Api base en PHP

En el archivo anterior es donde creamos las funciones con las llamadas que nos interesaba, ahora vamos a crear el archivo más importante que se conectará con usuarios.php

<?php

include_once 'usuarios.php';

class NombreDeTuApi{

    private $error;
    private $foto;
    function getAll(){
        $usuario = new Usuarios();
        $usuarios = array();
        $usuarios["items"] = array();

        $res = $usuario->obtenerUsuarios();

        if($res->rowCount()){
            while ($row = $res->fetch(PDO::FETCH_ASSOC)){
    
                $item=array(
                    "id" => $row["id"],
                    "nombre" => $row["nombre"],
                    "ape" => $row["ape"],
                    "email" => $row["email"],
                    "pass" => $row["pass"],
                    "foto" => $row["foto"]
                );
                array_push($usuarios["items"], $item);
            }
             echo json_encode($usuarios);
        }else{
            echo json_encode(array('mensaje' => 'No hay elementos registrados'));
        }
    }

    function getById($id){
        $usuario = new Usuarios();
        $usuarios = array();
        $usuarios["items"] = array();

        $res = $usuario->obtenerUsuario($id);

        if($res->rowCount() == 1){
            $row = $res->fetch();
        
            $item=array(
                "id" => $row["id"],
                "nombre" => $row["nombre"],
                "ape" => $row["ape"],
                "email" => $row["email"],
                "pass" => $row["pass"],
                "foto" => $row["foto"]
            );
            array_push($usuarios["items"], $item);
            $this->printJSON($usuarios);
        }else{
            $this->error('No hay elementos');
        }
    }
    function getByEmail($email){
        $usuario = new Usuarios();
        $usuarios = array();
        $usuarios["items"] = array();

        $res = $usuario->obtenerUsuarioEmail($email);

        if($res->rowCount() == 1){
            $row = $res->fetch();
        
            $item=array(
                "id" => $row["id"],
                "nombre" => $row["nombre"],
                "ape" => $row["ape"],
                "email" => $row["email"],
                "pass" => $row["pass"],
                "foto" => $row["foto"]
            );
            array_push($usuarios["items"], $item);
            $this->printJSON($usuarios);
        }else{
            $this->error('No hay elementos');
        }
    }

    function add($item){
        $usuario = new Usuarios();
        $res = $usuario->nuevoUsuario($item);
        $this->exito('Nuevo usuario registrado');
    }


    function error($mensaje){
        echo json_encode(array('mensaje' => $mensaje)); 
    }

    function exito($mensaje){
        echo json_encode(array('mensaje' => $mensaje)); 
    }

    function printJSON($array){
        echo json_encode($array);
    }

    function subirImagen($file){
        $directorio = "imagenes/";

        $this->foto = basename($file["name"]);
        $archivo = $directorio . basename($file["name"]);

        $tipoArchivo = strtolower(pathinfo($archivo, PATHINFO_EXTENSION));
    
        // valida que es imagen
        $checarSiImagen = getimagesize($file["tmp_name"]);

        if($checarSiImagen != false){
            //validando tamaño del archivo
            $size = $file["size"];

            if($size > 500000){
                $this->error = "El archivo tiene que ser menor a 500kb";
                return false;
            }else{

                //validar tipo de imagen
                if($tipoArchivo == "jpg" || $tipoArchivo == "jpeg"){
                    // se validó el archivo correctamente
                    if(move_uploaded_file($file["tmp_name"], $archivo . time())){
                        //echo "El archivo se subió correctamente";
                        return true;
                    }else{
                        $this->error = "Hubo un error en la subida del archivo";
                        return false;
                    }
                }else{
                    $this->error = "Solo se admiten archivos jpg/jpeg";
                    return false;
                }
            }
        }else{
            $this->error = "El documento no es una imagen";
            return false;
        }
    }

    function getImagen(){
        return $this->foto;
    }

    function getError(){
        return $this->error;
    }
}

?>

Aquí tenemos lo mismo, una función para cada función de usuario y alguna más para controlar errores, fíjate bien en el código y cambia el nombre de tu tabla, el nombre de las funciones anteriores o campos en el caso de que sean diferente, por lo demás copia el código y pégalo en un archivo llamada por ejemplo Api.php.

Además he añadido alguna función para controlar la subida de fotos, ya que quiero que los usuarios puedan añadir un avatar o foto.

Cómo crear un registro con nuestra API

Empezamos con el primer archivo que realmente va a hacer algo. Vamos a crear nuestro primer registro en la base de datos desde php.

<?php
include_once 'Api.php';
    
    $api = new NombreDeTuApi();
    $error = '';

$json = file_get_contents('php://input');
        $data = json_decode($json,true);
        $nombre = $data["nombre"];
        $ape = $data["ape"];
        $email = $data["email"];
        $pass = $data["pass"];
        if(isset($nombre)){
        	 $item = array(
        					'nombre' => $nombre,
        					'ape' => $ape,
        					'email' => $email,
        					'pass' => $pass
       						 );
        $api->add($item);
        }
?>

Este código lo copiamos y lo guardamos como add.php

Le pasamos los nombres de los campos que queremos pasarle a la base de datos para crear el registro.

Listo, ahora los archivos debemos dejarlos en nuestro hosting en una carpeta llamada por ejemplo api

Supongamos que nuestro dominio se llama example.com pues para acceder a nuestra API para crear registros en nuestra base de datos la URL de llamada será example.com/api/app.php

Obtener los registros de la base de datos

Si lo que queremos es que nos devuelva los registros de nuestra base de datos creamos un archivo llamada por ejemplo get.php con el código:

<?php
    include_once 'api.php';

    $api = new NombreDeTuApi();

    if(isset($_GET['id'])){
        $id = $_GET['id'];

        if(is_numeric($id)){
            $api->getById($id);
        }else{
            $api->error('El id es incorrecto');
        }
    }
    elseif(isset($_GET['email'])){
        $email = $_GET['email'];

        if(is_string($email)){
            $api->getByEmail($email);
        }else{
            $api->error('El email es incorrecto');
        }
    }
    else{
        $api->getAll();
    }
?>

Lo que hace este código es crear una instancia de la clase de tu api, ( yo le he puesto como ejemplo NombreDeTuApi, tu pon su nombre real).

Como usar un método GET

Recordar que para usar un método get hay que pasarle la URL donde tengas el archivo php y añadirle los argumentos que necesites, por ejemplo:

  • https://app.invictustaekwondomalaga.com/appmovil/rest/index.php?email=pepegutierrez@admin el usuario con ese email
  • https://app.invictustaekwondomalaga.com/appmovil/rest/index.php?id=2 el registro número 2
  • https://app.invictustaekwondomalaga.com/appmovil/rest/index.php todos los registros.

Para saber el contenido de los argumentos en php (?id, ?email, etc) se hace con $_GET[«NombredelArgumento»]

Por lo tanto, en el código usamos la sintaxis $_GET[‘id’] si el campo se llama id, usará la función getByID() y si no lo encuentra marcará un error.

Si en vez de mandarle un id le has mandado un email usará la función getByEmail() y si no lo encuentra marcará otro error.

Finalmente si no le mandas ningún argumento en la url usará la función getAll() que te devolverá todos los registros.

Conclusión

Ya tendrías una api básica para poder grabar y leer registros.

Te preguntarás, que como llamamos al archivo add.php para crear un usuario. Esta parte la vamos a hacer desde c# en nuestra aplicación xamarin y te la mostraré en el siguiente artículo.

Espero que te haya servido de ayuda.

 
Resumen
Como crear un API para registrar usuarios
Nombre del artículo
Como crear un API para registrar usuarios
Descripción
Hoy os enseñaré como crear tu propia API para poder conectarla con tu app xamarin y crear un sistema de usuarios en c#.
Autor
Publicador
lenguajesdeprogramacion.com
Logo

Deja un comentario