Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/servicioWeb/Rest/Practica»
De WikiEducator
< Usuario:ManuelRomero | PHP | servicioWeb
(10 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
− | + | __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/ | + | ;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''' | ||
− | + | ====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) se ha insertado correctamente | ||
El producto (nombre_corto) no se ha podido insertar | 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 | |
− | El producto (nombre_corto) se ha | + | |
− | El producto ( | + | *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
Contenido
- 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
Nos devolverá un listado con el nombre corto de todos los productos
Get un producto
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:
Posible solución del servidor (index.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; } ?> |
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
- Según apretemos las opcines podremos ver el resultado
http://manuel.infenlaces.com/dwes/RestFull_Client/index.php
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 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; }