WebService con PHP

Estándar

Que tal, lectores de éste blog medio irregular, en esta entrada como el título lo dice vamos a ver como crear un WebService super sencillo donde implementaremos una operación fácil, por no decir pan comido.

Seguramente te han planteado el problema en tu universidad o bachillerato de “Calcular el índice de masa corporal de una persona” (léase con voz de maestro) y la verdad es que es fácil, incluso puedes decirme en los comentarios, “Pero eso no está complicado”, “Ya hay páginas que sacan el cálculo”, “Para que lo hago si ya lo sé”. Cuál sea tu comentario, éste blog es para ver, practicar, repasar e incluso aprender cosas nuevas, así que el cálculo del IMC lo vamos a hacer del lado del servidor (no se lo esperaban verdad :P).

Requisitos

Para hacer esta práctica debemos tener encuanta que necesitamos:

  • Host (puede ser gratuito si queremos hacer esta prueba)
  • Editor de código (Usaré Visual Studio Code)
  • Muchas ganas de hacer tu webservice

Con todo listo vamos a explicar el flujo de nuestro mini proyecto con  un pequeño diagrama.

Flujo de los datos

1. Diagrama para funcionamiento del webservice

En el diagrama se muestra el funcionamiento básico del webservice que vamos a implementar en PHP, el flujo comienza en el dispositivo que vamos a utilizar como “cliente”, en este caso vamos a suponer un telefono celular, el cuál mandará una peticion a un servidor web, este servidor según sus reglas atenderá dicha petición y nos regresará una respuesta.

Lo único que tenemos nosotros que hacer aqui es programar nuestro webservice en PHP, no hay que configurar nada del host o del dispositivo, ya que podemos probar desde el mismo navegador del dispositivo.

Comenzaremos por crear la estructura en nuestro host, regularmente un webservice tiene una estructura de carpetas como la siguiente:

/API/V1/index.php

Esto es solamente una carpeta API que contiene una carpeta V1 donde estará nuestro index.php

Manos a la obra

En nuestro editor preferido vamos a comenzar por utilizar un header el cual nos dirá que tipo es el documento, en nuestro caso será de tipo application/json.

<?php
    header("Content-Type:application/json"); 
?>

Quizá te preguntes el porque un contenido de tipo application/json, la respuesta es que este tipo de “servicios” utiliza protocolos para el envío y recepción de peticiones.

Con el header definido vamos a empezar con el procesamiento de la información, es por ello que utilizaremos la variable $_GET para obtener datos que sean enviados en la petición en la url del navegador.

Debemos saber el nombre de quién es la persona que está consultando su IMC, así que el primer dato que recibiremos será un nombre y validaremos que el dato no venga vacío.

<?php
    header("Content-Type:application/json");
    
    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        //Nombre valido       
    }
    else
    {
        //Nombre no valido
    }
?>

Ya que estamos seguros que el nombre enviado a la petición contiene algún valor, vamos a revisar si los valores del peso y la estatura contienen valores, as[i que realizaremos una evaluación similiar a la del nombre:

<?php      
    header("Content-Type:application/json");

    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        $peso = $_GET['peso'];
        $estatura = $_GET['estatura'];

        if(!empty($peso) && !empty($estatura))
        {
            //Calculo de IMC
        }
        else
        {
            //Peso o estatura no validos
        }
    }
    else
    {
        //Nombre no valido
    }
?>

Ahora vamos a realizar la operación necesaria para el cálculo con los datos ya otenidos, la forma de calcular el IMC se obtiene dividiendo el peso entre la estatura elevada al cuadrado.

IMC = peso / (estatura * estatura)

Esto mismo haremos en el c[odigo para calcular el IMC y casi habremos terminado.

<?php      
    header("Content-Type:application/json");

    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        $peso = $_GET['peso'];
        $estatura = $_GET['estatura'];

        if(!empty($peso) && !empty($estatura))
        {
            $estatura /= 100;
            $imc = $peso / ($estatura * $estatura);
            $imc = round($imc, 2); 
        }
        else
        {
            //Peso o estatura no validos
        }
    }
    else
    {
        //Nombre no valido
    }
?>

Por último vamos a crear una función que va a devolver la respuesta en el formato que se utiliza para los webservices, una respuesta HTTP en formato JSON, esta función la utilizaremos para devolver el resultado del IMC calculado, así como los mensajes de errores (como el nombre o peso/estatura vacíos).

<?php
header("Content-Type:application/json");

    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        $peso = $_GET['peso'];
        $estatura = $_GET['estatura'];

        if(!empty($peso) && !empty($estatura))
        {
            $estatura /= 100;
            $imc = $peso / ($estatura * $estatura);
            $imc = round($imc, 2);
            deliver_response(200, "$nombre tu IMC es de $imc", $imc);
        }
        else
        {
            deliver_response(200, "peso o estatura no validos", null);
        }
    }
    else
    {
        deliver_response(200, "Nombre no valido", null);
    }

    function deliver_response($status, $status_message, $data)
    {
        header("HTTP/1.1 $status $status_message");
        $response['status'] = $status;
        $response['status_message'] = $status_message;
        $response['data'] = $data;

        $json_response = json_encode($response);
        echo $json_response;
    }

?>

La función deliver_response() lo que hace es recibir un status, mensaje y datos, los cuales enviará como respuesta en formato HTTP, éste formato al final lo convertiremos a un objeto JSON y lo lanzaremos como respuesta.

Probaremos el WebService

Para probar el WebService tenemos que subir el achivo index.php que creamos a nuestro host, en mi caso la ruta del archivo es:

http://www.raptorsarts.com.mx/API/IMC/V1/index.php

Para ver el funcionamiento debemos de pasar los parámetros desde la url ya que si damos clic a nuestro WebService nos mandará el error de nombre no válido, así que para probar el nombre podemos ingresar el parámetro a la url.

http://www.raptorsarts.com.mx/API/IMC/V1/index.php?nombre=Antonio

Ahora nos arroja el error del peso o estatura no válidos, solucionamos esto enviando también por parámetros el peso y la estatura.

http://www.raptorsarts.com.mx/API/IMC/V1/index.php?nombre=Antonio&peso=75&estatura=189

Ahora si, el WebService nos muestra nuestro IMC, podemos verlo desde la información mostrada en el navegador o desde la opción de desarrollador el objeto que nos regresa y explorarlo.

Visualización del resultado

Visualización del resultado

 

Con esto terminamos, si tienes algun problema de implementación no dudes en escribirme o dejarme un comentario.

Aquí te dejo el link del repositorio por si necesitas revisar el código completo:
WebService IMC – GitHub

¿Qué sigue?

Ahora viene una pregunta interesante, ¿te imaginas el poder de los webservices?, si pones un poco de atención en el flujo de la petición hay un Horno de Microondas, lo puse a propósito (obviamente), porque con los webservices podemos hacer mucho IoT (Internet of Things – Internet de las Cosas) agregando algun harware para comunicar nuestro WebService con lo que se nos ocurra controlar, las luces de nuestro cuarto, nuestro XBox o saber cuanta energía eléctrica estamos utilizando. Ésto y muchisimas cosas más podemos hacer, poco a poco iré subiendo pequeños tutoriales.

Sin más por el momento espero que llegaran hasta éste punto del post (a decir verdad uno de los más largos) pero el contenido a mi parecer es sencillo de comprender y replicar.

Aun seguiremos utilizando WebServices, nos vemos en la siguiente entrada, hasta la próxima y los dejo con algo tranquilo que les servirá para hacer su WebService.

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s