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

De WikiEducator
Saltar a: navegación, buscar
 
(10 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.
 
;Vamos a crear un RestFull en php usando Curl en el cliente para consumirlo.
 
===El servidor===
 
===El servidor===
 
*En el servidor debemos crear un servicio que responda a las siguientes solicitudes (GET, POST, PUT, DELETE)
 
*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}}
 
{{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
 
;http://manuel.infenlaces.com/dwes/RestFull_Server/productos
 
  Nos devolverá un listado con el nombre corto de todos los productos
 
  Nos devolverá un listado con el nombre corto de todos los productos
 
+
====Get un producto====
;http://manuel.infenlaces.com/dwes/producto/3DSNG
+
;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'''
 
  Nos devolverá todos los datos del producto cuyo código especificamos, en este caso '''''3DSNG''''' o el mensaje '''no existe ese producto'''
;http://localhost/servicio_rest/producto/insertar
+
====Insert un producto (PUT)====
Insertaremos los productos que le pasaremos por un formulario retornando la información
+
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) se ha insertado correctamente
 
  El producto (nombre_corto) no se ha podido insertar
 
  El producto (nombre_corto) no se ha podido insertar
;http://localhost/servicio_rest/producto/actualizar/codigo/
+
{{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}}
Actualizaremos el producto especificado en codigo cuyos datos recibiremos del cliente
+
====DEL un producto====
El sistema nos informará
+
http://manuel.infenlaces.com/dwes/RestFull_Server/productos/del/1111
  El producto (nombre_corto) se ha actulizado
+
 
  El producto (código) no se ha podido actualizar
+
*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 11: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;
}