Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/servicioWeb/Rest/Practica»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «{{:Usuario:ManuelRomero/PHP/servicioWeb/Rest/nav}}»)
 
 
(14 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
{{:Usuario:ManuelRomero/PHP/servicioWeb/Rest/nav}}
+
__TOC__
 +
;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)
 +
{{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
 +
{{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
 +
{{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
 +
{{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:
 +
{{Plegable|hide|Posible solución del servidor (index.php)|
 +
<source lang=php>
 +
<?php
 +
require_once('DB.php');
 +
require_once('Producto.php');
 +
 
 +
$metodo = $_SERVER['REQUEST_METHOD'];
 +
 
 +
$recurso = $_SERVER['REQUEST_URI'];
 +
 
 +
switch ($metodo) {
 +
    case 'GET':
 +
        if (isset($_GET['codigo'])) {
 +
 
 +
            $codigo = $_GET['codigo'];
 +
            $respuesta = DB::obtieneProducto($codigo);
 +
        } else {
 +
            $respuesta = DB::obtieneProductos();
 +
        }
 +
 
 +
        echo json_encode($respuesta,true);
 +
        break;
 +
    case 'POST'://update 
 +
        $producto[] = $_POST['codigo'];
 +
        $producto[] = $_POST['nombre'];
 +
        $producto[] = $_POST['nombre_corto'];
 +
        $producto[] = $_POST['descripcion'];
 +
        $producto[] = (int) $_POST['PVP'];
 +
        $producto[] = $_POST['familia'];
 +
        $respuesta = DB::insertarProducto($producto);
 +
        break;
 +
    case 'DELETE':
 +
        $respuesta = DB::borrarProducto($cod);
 +
        echo $respuesta;
 +
        break;
 +
    case 'PUT'://insert
 +
        //Una manera de poder obtener los valores que le pase el cliente
 +
        parse_str(file_get_contents("php://input"), $producto);
 +
        $respuesta = DB::actualizaProducto($producto);
 +
        break;
 +
}
 +
 
 +
?>
 +
 
 +
</source>
 +
}}
 +
{{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:
 +
#Cuando accedemos podremos ver un listado de todos los códigos de productos en un select para poder seleccionar uno de ellos.
 +
#Tendremos un botón de tipo submit para cada una de las posibles acciones como podemos ver en la imagen
 +
[[Archivo:practica_rest.png|400px|center]]<br />
 +
#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|
 +
<source lang=html5>
 +
<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>
 +
 
 +
 
 +
</source>
 +
}}
 +
*Lógicamente las funciones especificadas realizan llamadas, usando curl, al servicio que antes hemos desarrollado
 +
 
 +
*Vamos a ver por ejemplo como hacemos un update  y un get de todos los productos
 +
<source lang=php>
 +
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;
 +
}
 +
</source>

Última revisión de 10:39 17 abr 2017

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
  • Lógicamente las funciones especificadas realizan llamadas, 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;
}