Usuario:ManuelRomero/PHP/servicioWeb/Rest/Practica

De WikiEducator
Saltar a: navegación, buscar


Vamos a crear un RestFull en php usando Curl en el cliente para consumirlo.

El servidor

  • En el servidor debemos crear un servicio que responda a las siguientes solicitudes (GET, POST, PUT, DELETE)
Icon present.gif
Tip: En los ejemplos de las url, deberás cambiar manuel.infenlaces.com/dwes por tu url


Get productos

http://manuel.infenlaces.com/dwes/RestFull_Server/productos
Nos devolverá un listado con el nombre corto de todos los productos

Get un producto

http://manuel.infenlaces.com/dwes/RestFull_Server/productos/3DSNG
Nos devolverá todos los datos del producto cuyo código especificamos, en este caso 3DSNG o el mensaje no existe ese producto

Insert un producto (PUT)

http://manuel.infenlaces.com/dwes/RestFull_Server/productos/insert

  • Insertaremos los productos que le pasaremos por un formulario retornando la información
El producto (nombre_corto) se ha insertado correctamente
El producto (nombre_corto) no se ha podido insertar
Icon present.gif
Tip: Recuerda que esta solicitud ha de ser un PUT no un GET. Si picamos en la url, nos saldrán datos porque el servidor lo interpretará como un GET y esto es listar todos los productos


DEL un producto

http://manuel.infenlaces.com/dwes/RestFull_Server/productos/del/1111

  • Borrará el producto cuyo código sea 1111 si existe y nos informará:
El producto (nombre_corto) se ha insertado correctamente
El producto (nombre_corto) no se ha podido insertar
Icon present.gif
Tip: Igual que en el caso anteriro la solicitud al servidor ha de ser DEL y no GET


POST para actulizar un producto

http://manuel.infenlaces.com/dwes/RestFull_Server/productos/update/1111

  • Actualizará el producto cuyo código es 1111 con los datos que reciba del cliente y os informará de ello
El producto (nombre_corto) se ha actualizado correctamente
El producto (nombre_corto) no se ha podido actualizar
Icon present.gif
Tip: La solicitud ha de ser POST


.htaccess

Debemos de hacer las url amigables En realidad en el servidor siempre se deberá de ejecutuar el fichero index.php cuyo código se facilita a continuación:

Icon present.gif
Tip: Los métodos de la base de datos son los típicos, por lo que no debería de costar su implementación


El cliente

  • Ahora nos queda crear el cliente. Para ello podemos crear un formulario para poder pasar datos al cliente
  • La idea que os propongo es la siguiente:
  1. Cuando accedemos podremos ver un listado de todos los códigos de productos en un select para poder seleccionar uno de ellos.
  2. Tendremos un botón de tipo submit para cada una de las posibles acciones como podemos ver en la imagen
Practica rest.png

  1. Según apretemos las opcines podremos ver el resultado
http://manuel.infenlaces.com/dwes/RestFull_Client/index.php

{{Plegable|hide|El esqueleto del index del cliente|

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <?php
    require_once 'Producto.php';
    require_once 'funciones.php';
    $productos = obtener_productos();
//inicializo variables
    $listar_productos = [];
    $producto = [];
    $producto['codigo'] = null;
    $producto['nombre_corto'] = null;
    $producto['nombre'] = null;
    $producto['descripcion'] = null;
    $producto['PVP'] = null;
    $producto['familia'] = null;
 
 
//Leo la acción solicitada Si la hay
    switch ($_POST['RestService']) {
        case "Listar Producto":
            $cod = $_POST['codigo_producto'];
            echo "<h1>" . $_POST['RestService'] . "</h1>";
            $producto = obtener_producto($cod);
            $producto = $producto[0];
            break;
        case "Listar Productos":
            echo "<h1>" . $_POST['RestService'] . "</h1>";
            $lista_productos = $productos;
            break;
        case "Insertar":
            echo "<h1>" . $_POST['RestService'] . "</h1>";
            $respuesta = insertar_productos($_POST);
            echo "<h1>$respuesta</h1>";
            break;
        case "Borrar":
            echo "<h1>" . $_POST['RestService'] . "</h1>";
            $cod = $_POST['codigo_producto'];
            $respuesta = borrar_producto($cod);
            $productos = obtener_productos();
            echo "<h1>$respuesta</h1>";
            break;
        case "Actualizar":
            echo "<h1>" . $_POST['RestService'] . "</h1>";
            $respuesta = actualizar_producto($cod);
            //$productos = obtener_productos();
            break;
        default:
            echo "<h1> No se ha elegido nada </h1>";
            break;
    }
    ?>
    <!DOCTYPE html>
    <!--
    To change this license header, choose License Headers in Project Properties.
    To change this template file, choose Tools | Templates
    and open the template in the editor.
    -->
    <body>
        <fieldset>
            <legend>Acciones sobre productos</legend>
            <form action="." method="POST">
                <label for="codgio">codigo</label>
                <input type="text" name="codigo" value="<?php echo $producto->cod ?>" />
                <br>
                <label for="nombre_corto">Nombre corto</label>
                <input type="text" name="nombre_corto" value= "<?php echo $producto->nombre_corto ?>" />
                <br>
                <label for="nombre">Nombre</label>
                <input type="text" name="nombre" value= "<?php echo $producto->nombre ?>" />
                <br>
                <label for="descripcion">Descripción</label>
                <input type="text" name="descripcion" value="<?php echo $producto->descripcion ?>" />
                <br>
                <label for="pvp">Percio Venta públic</label>
                <input type="text" name="pvp" value="<?php echo $producto->PVP ?>" />
                <br>
                <label for="familia">familia</label>
                <input type="text" name="familia" value="<?php echo $producto->familia ?>" />
                <br>
                <label for="codigo_producto">Código de producto</label>
<!-- Visualizamos los códigos de los productos para poder seleccionar uno de ellos 
Una vez seleccionados los podremos actualizar o borrar
-->
                <select name="codigo_producto" id="">
                    <?php
                    foreach ($productos as $producto) {
                        echo "<option value=" . $producto->cod . ">" . $producto->cod . "</option>";
                    }
                    ?>
                </select>
                <br />
 
                <input type="submit" value="Listar Producto" name="RestService">
                <input type="submit" value="Listar Productos"name="RestService">
                <input type="submit" value="Borrar"name="RestService">
                <input type="submit" value="Insertar"name="RestService">
                <input type="submit" value="Actualizar"name="RestService">
            </form>
        </fieldset>
 
    </body>
    <?php
//Si tengo lista de productos los visualizo en una tabla
    if (isset($lista_productos)):
        ?>
 
        <table border = 1>
            <tr>
                <th>Código</th>
                <th>Nombre</th>
                <th>Nombre Corto</th>
                <th>PVP</th>
                <th>Descripción</th>
                <th>Familia</th>
            </tr>
            <?php
            foreach ($lista_productos as $p) {
                echo "<tr><td>" . $p->cod . "</td>
                          <td>" . $p->nombre . "</td>
                          <td>" . $p->nombre_corto . "</td>
                           <td>" . $p->PVP . "</td>
                           <td>" . $p->descripcion . "</td>    
                            <td>" . $p->familia . "</td>   
                             </tr>";
            }
        endif;
        ?>
 
    </table>
 
 
 
</html>
  • Lógicamente las funciones especificadas realizan llamdas usando curl al servicio que antes hemos desarrollado
  • Vamos a ver por ejemplo como hacemos un update y un get de todos los productos
function obtener_productos() { 
    $ch = curl_init("http://manuel.infenlaces.com/dwes/RestFull_Server/productos");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $productos = curl_exec($ch);
    $productos = json_decode($productos);
    curl_close($ch);
    return $productos;
}
function actualizar_producto($codigo) {
    $ch = curl_init("http://localhost/dwes/RestFull_Server/update/$codigo");
//curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Especificamos una solicitud delete
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
    $producto = curl_exec($ch);
    $producto = json_decode($producto);
    curl_close($ch);
    return $producto;
}