Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/servicioWeb/rest»
De WikiEducator
< Usuario:ManuelRomero | PHP | servicioWeb
(→Haciendo un servicio REST) |
(→Ejemplo de consumir un servicio REST) |
||
(10 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
− | |||
{{:Usuario:ManuelRomero/PHP/servicioWeb/nav}} | {{:Usuario:ManuelRomero/PHP/servicioWeb/nav}} | ||
+ | __TOC__ | ||
===REST=== | ===REST=== | ||
*Término introducido por [[https://es.wikipedia.org/wiki/Roy_Fielding Roy Fielding]] en 2000 (es uno de los principales autores de la especificación HTTP) | *Término introducido por [[https://es.wikipedia.org/wiki/Roy_Fielding Roy Fielding]] en 2000 (es uno de los principales autores de la especificación HTTP) | ||
Línea 170: | Línea 170: | ||
</source> | </source> | ||
}} | }} | ||
+ | ;La parte del cliente | ||
+ | *En este caso la parte de cliente es muy sencilla, simplemente tiene que hacer una llamada a esta página y leer su contenido | ||
+ | *Para esto puede valer usar la fución '''''get_file_content''''' | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | |||
+ | $response = file_get_contents('http://localhost/servidor_rest/index.php'); | ||
+ | |||
+ | |||
+ | $response = json_decode($response); | ||
+ | echo "Saludo que viene del servidor $response"; | ||
+ | ?> | ||
+ | </source> | ||
+ | {{Actividad| | ||
+ | *Modifica el ejemplo anterior sin cambiar el nombre de los ficheros (usa el módulo rewrite de apache para que | ||
+ | *La página web que invoca al servicio le pase un nombre de persona y un idioma (inglés, francés o español) | ||
+ | *La invocación al servicio web será http://localhost/servidor_rest/saludo/$nombre/$idioma | ||
+ | *La intención es que el servicio web saludo al nombre especificado en el idioma establecido | ||
+ | *Tanto el nombre de usuario como el del idioma lo facilita el usuario de la aplicación | ||
+ | }} | ||
+ | <!-- | ||
+ | ;Fichero .htaccess | ||
+ | <source lang=bash> | ||
+ | RewriteEngine on | ||
+ | RewriteBase /servidor_rest/ | ||
+ | RewriteRule ^(.*)$ index.php?datos=$1 | ||
+ | </source> | ||
+ | ;Cliente | ||
+ | <source lang=html5> | ||
+ | if ($_POST['enviar']){ | ||
+ | $nombre = filter_input(INPUT_POST,'nombre'); | ||
+ | $idioma = filter_input(INPUT_POST,'nombre'); | ||
+ | $respuesta = file_get_contents('http://localhost/servidor_rest/$nombre/$idioma'); | ||
+ | $respuesta = json_decode($respuesta); | ||
+ | echo $respuesta; | ||
+ | |||
+ | } | ||
+ | ?> | ||
+ | <!doctype html> | ||
+ | <html lang="en"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <title>Document</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <form action="." method="POST"> | ||
+ | Inserta un nombre | ||
+ | <input type="text" name="nombre"/> | ||
+ | <select name="idioma" id=""> | ||
+ | <option value="frances"Francés></option> | ||
+ | <option value="ingles">Inglés</option> | ||
+ | <option value="espanol">Español</option> | ||
+ | </select> | ||
+ | <input type="submit" value="enviar" name="enviar"> | ||
+ | </form> | ||
+ | |||
+ | </body> | ||
+ | </html> | ||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | ;El servidor | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | require_once('DB.php'); | ||
+ | $metodo = $_SERVER['REQUEST_METHOD']; | ||
+ | |||
+ | $recurso = $_SERVER['REQUEST_URI']; | ||
+ | |||
+ | switch($metodo){ | ||
+ | case 'GET': | ||
+ | $nombre = $_GET['nombre']; | ||
+ | ....... | ||
+ | |||
+ | </source> | ||
+ | --> | ||
− | |||
====La parte del cliente==== | ====La parte del cliente==== | ||
− | ===== | + | ;Curl |
+ | Înstalamos el comando o aplicación '''''curl''''' | ||
+ | sudo apt-get install curl | ||
+ | *Lo primero debemos tener instalada la librería de curl para php | ||
+ | sudo apt-get install php5-curl | ||
+ | * | ||
+ | *La forma de realizar una solicitudes es realizando una llamada completa a la web | ||
+ | *Ver el contenido del fichero como hemos hecho antes, es simplemente hacer una especie RPC (Invocación o llamada a métodos remotos). | ||
+ | *Usar curl con php es relativamente sencillo | ||
+ | http://php.net/manual/es/curl.examples-basic.php | ||
+ | *Para usarlo seguimos los siguientes pasos: | ||
+ | #Inicializamos una sesión cURL usando '''''curl_init()''''' | ||
+ | #Se establecen las opciones para la transferencia con '''''curl_setopt()''''' (Se especifican más abajo. | ||
+ | #Ejecutamos la sesión '''''curl_exec()''''' Aquí se puede recoger el resultado | ||
+ | #Cerramos la sesión con curl_close() | ||
+ | {{Resumen| | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | |||
+ | $ch = curl_init("http://www.example.com/"); | ||
+ | |||
+ | curl_setopt($ch, CURLOPT_FILE, $fp); | ||
+ | curl_setopt($ch, CURLOPT_HEADER, 0); | ||
+ | |||
+ | curl_exec($ch); | ||
+ | curl_close($ch); | ||
+ | |||
+ | ?> | ||
+ | </source> | ||
+ | }} | ||
+ | |||
+ | |||
+ | *Una lista de las opciones más utilizadas | ||
+ | ;Especificar la URL | ||
+ | ; CURLOPT_URL EL la URL donde está el recurso al que queremos acceder. También se puede establecer en el método curl_init() | ||
+ | <source lang =php> | ||
+ | $llamada = curl_init(); | ||
+ | curl_setopt($llamada, CURLOPT_URL, "http://localhost/servicio_rest/productos); | ||
+ | </source> | ||
+ | *O bien | ||
+ | <source lang =php> | ||
+ | $llamada = curl_init("http://localhost/servicio_rest/productos); | ||
+ | </source> | ||
+ | |||
+ | ;CURLOPT_HEADER: | ||
+ | *Para incluir las cabeceras de las respuestas (true o false | ||
+ | *Normalmente lo estableceremos a false, si solo nos interesa el contendio | ||
+ | *Se puede establecer a false, o pasar una cadena de caracteres tipo | ||
+ | <source lang =php> | ||
+ | $llamada = curl_init(); | ||
+ | curl_setopt($llamada, CURLOPT_HEADER, false); | ||
+ | </source> | ||
+ | |||
+ | ;CURLOPT_RETURNTRANSFER | ||
+ | *Para que en lugar de mostrar la respuesta, devuelva una cadena de caracteres de tipo string | ||
+ | <source lang =php> | ||
+ | $llamada = curl_init(); | ||
+ | curl_setopt($llamada, CURLOPT_RETURNTRANSFER, true); | ||
+ | </source> | ||
+ | |||
+ | ;CURLOPT_POST | ||
+ | *Establece una solicitud post. En este caso se usa la opción siguiente para pasar datos a la solicitud | ||
+ | <source lang =php> | ||
+ | $llamada = curl_init(); | ||
+ | curl_setopt($llamada, CURLOPT_POST, true); | ||
+ | </source> | ||
+ | ;CURLOPT_POSTFIELDS | ||
+ | *Para pasar los datos de la solicitud POST | ||
+ | curl_setopt($llamada, CURLOPT_POSTFIELDS, "usuario=dwes&pass=abc123.;"); | ||
+ | *Alternativamente podemos usar el método http_build_query (...) pasándole un array asociativo | ||
+ | <source lang =php> | ||
+ | $llamada = curl_init(); | ||
+ | $datosPost=['usuariol'=>'dwes', password' =>'abc123.' ]; | ||
+ | ); | ||
+ | $llamada = curl_init(); | ||
+ | curl_setopt($llamada, CURLOPT_URL, "http://localhost/servicios_rest/login.php"); | ||
+ | curl_setopt($llamada, CURLOPT_POST, true); | ||
+ | curl_setopt($llamada, CURLOPT_POSTFIELDS, http_build_query($datosPost)); | ||
+ | </source> | ||
+ | |||
+ | ;CURLOPT_CUSTOMERREQUEST | ||
+ | *Establece la acción solicitada al servidor cuando esta no es ni GET (por defecto) ni POST (CURL_POST). Como ya hemos comentado suele ser "DELETE"o 'PUT' u otros tipos de peticiones HTTP menos comunes. | ||
+ | *Para pasar datos que se necesitaran en esta solicitud, se usa igualemnte la opción CURLOPT_POSTFIELDS | ||
+ | |||
+ | <source lang =php> | ||
+ | $llamada = curl_init(); | ||
+ | $datos=['producto'=>'Cod_123dwes';stock=500]; | ||
+ | ); | ||
+ | curl_setopt($llamada, CURLOPT_CUSTOMREQUEST, 'DELETE'); | ||
+ | curl_setopt($lamada, CURLOPT_POSTFIELDS, http_build_query($datos)); | ||
+ | .... | ||
+ | $datos=['producto'=>'Cod_123dwes' | ||
+ | curl_setopt($llamada, CURLOPT_CUSTOMREQUEST, "PUT"); | ||
+ | curl_setopt($cllamada, CURLOPT_POSTFIELDS, http_build_query($datos)) | ||
+ | </source> | ||
+ | |||
+ | ====Ejemplo de consumir un servicio REST==== | ||
+ | <br /> | ||
+ | {{Actividad| | ||
+ | *Hacemos un RESTFull (atenderemos a GET, PUT, POST, DELETE) para las siguientes acciones | ||
+ | ;http://localhost/servicio_rest/productos : | ||
+ | :Nos devolverá un listado con el nombre corto de todos los productos | ||
+ | ;http://localhost/servicio_rest/producto/Codigo | ||
+ | :Nos devolverá todos los datos del producto cuyo código especificamos o el mensaje no existe ese producto | ||
+ | ;http://localhost/servicio_rest/producto/insertar | ||
+ | :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 podid insertar | ||
+ | ;http://localhost/servicio_rest/producto/actualizar/codigo/nombre | ||
+ | : Actualizaremos el nombre del producto especificado en codigo | ||
+ | #El producto (nombre_corto) se ha actulizado | ||
+ | #El producto (código) no se ha podido actualizar | ||
+ | }} | ||
+ | ;Haciendo las url amigables | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ;Solución en el servidor | ||
+ | <source lang=php> | ||
+ | |||
+ | </source> | ||
+ | ;Solución en el cliente | ||
+ | <source lang=php> | ||
+ | </source> | ||
+ | ;Obtener datos de la geografía española | ||
+ | *https://geoapi.es/documentacion |
Última revisión de 05:21 21 mar 2020
Contenido
REST
- Término introducido por [Roy Fielding] en 2000 (es uno de los principales autores de la especificación HTTP)
- Todos los recursos a los que accedemos en la web son definidos y diseccionados
- Rest define cómo se establece una interacción entre sistemas basada en un navegador web y http
- interfaz
- Como de exponernos al exterior para que puedan interactuar con nosotros
- Cómo recoger los datos para poderlos interpretar
- Como generar una salida para que nos la entiendas
- web
- red de páginas o recursos que se comunica por el protocolo http
(No es una definición, pero sí un concepto importante y una realidad).
Base de Rest
- Rest no es un estándar, es una especificación basada en estándares
- http
- Protocolo sin estado
- Vebos o acciones en la solicitud GET, POST, DELETE, UPDATE y PUSH.
- URL
- Representación de los recursos
- Tipos MIME : text/html , text/xml, text/json,...
|
El protocolo http establece en cada mensaje http un verbo o acción que encabeza la solicitud del mensaje Este puede ser
|
- Estas acciones suelenser comparados con las operaciones asociadas a la tecnología de base de datos,
operaciones CRUD: CREATE, READ, UPDATE, DELETE.
- Existen otra analogías como podemos ver en la tabla siguiente:
Accion | HTTP | SQL | Copy&Paste | UNIX Shell |
---|---|---|---|---|
Create | PUT | Insert | Pegar | > |
Read | GET | Select | Copiar | < |
Update | POST | Update | Pegar | >> |
Delete | DELETE | Delete | Cortar | Del / rm |
Acción HTTP SQL Copy&Paste Unix Shell Create PUT Insert Pegar > Read GET Select Copiar < Update POST Update Pegar después >> Delete DELETE Delete Cortar Del/rm
|
URI y URL's amigables
- Una URL es el localizador de ese recurso, por ejemplo
http://localhost/tienda/producto.php La URL es http://localhost/tienda.php El URI o recurso es producto.php Plantilla:Referencias en la web
- Una URL amigable es una URL que el cliente va a escribir en el navegador, aunque no existe tal cual en el servidor, sino que el servidor realiza una tradcucción
http://programandolo.blogspot.com.es/2013/06/reglas-de-reescritura-parte-1.html#more
- supongamos que en nuestro proyecto tenemos la URL
http://localhost/reescritura/paginaAmigosConfianza.php&dato=pedro
- Es claro ver que a alguien le sería mas claro escribir
http://localhost/reescritura/amigo/pedro
- Para conseguir esto, lo que tendríamos que hacer es establecer una regla en el servidor de modo que traduzca una url en la otra
- Pasos a seguir
- La sobreescritura de direcciones amigables la hace el módulo rewrite' de apache
- Primero miramos a ver si tenemos ese módulo instalado
/usr/sbin/apachectl -t -D DUMP_MODULES
- Nos listará los módulos instalados. Buscamos rewrite
- En caso de no tenerlo instalado lo instalamos
sudo a2enmod rewrite
- Después reiniciamos el servicio
sudo service apache2 restart
- Hay que recordar que para que se apliquen las directivas del fichero .htaccess, debemos tener habilitada para ese directorio (o para todos) la directiva AllowOverride All
<Directory /var/www> AllowOverride All </Directory>
- Ahora escribimos las reglas de
RewriteEngine on RewriteBase /servicio_rest/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,NC,L]
- Las reglas de reescritura se deben definir en los ficheros de configuración de Apache (httpd.conf) o, en el caso que este activada la capacidad de reescritura, en un archivo .htaccess localizado en el directorio del servidor web donde se quiere que tenga efecto.
- Estambecemos /servicio_rest como directorio base
- Las tres reglas siguiente establece que directorios (-d), ficheros (-f) y enlaces simbólicos (-l) que ya existen, sobre ellos no sea aplicada las reglas de reescritura.
- El último punto es la reescritura
En este caso tenemos la expresión regunar ^(.+)$
- Se puede leer como cualquier conjunto de caracteres al principio que contenga uno o más caracteres hasta el final
- Esta expresión regular será tomada seguida de el dominio y el directorio establecido como base, es decir después de http://localhost/servicio_rest/ .....
- Posteriormente puedo tomar su contenido en la variable $1
- Nos realiza la transformación siguiente (1) escrible el cliente, (2) lee el servidor
http://localhost/servicio_rest/productos/1 http://localhost/servicio_rest/index.php?url=productos/1
Haciendo un servicio REST
- Ahora toca la parte práctica
- Vamos a implementar un servicio web que realice una suma y resta, al igual que hicimos con soap
- Antes de ello, para probarlo haremos un ejemplo que solo en el que el servicio nos salude
- Servidor
- En el servidor lo que tenemos que hacer es recoger la solicitud que nos hacen y crear una respuesta
- La solicitud puede ser GET POST PUT DELETE
- En php podemos saber este valor de la superglobal $_SERVER
$metodo = $_SERVER['REQUEST_METHOD'] Sabiendo esto es código sería sencillo <?php require_once('DB.php'); $metodo = $_SERVER['REQUEST_METHOD']; $recurso = $_SERVER['REQUEST_URI']; switch($metodo){ case 'GET': $respuesta= "Hello person, wellcome this site" break; case 'POST': $respuesta ="Sirviendo por POST post"; break; case 'DELETE': $respuesta ="Sirviendo por DELETE delete"; break; case 'PUT': $respuesta ="Sirviendo por PUT put"; break; default: $respuesta ="Desconocido!!!!"; } echo json_encode ($respuesta, true); } ?>
|
- La parte del cliente
- En este caso la parte de cliente es muy sencilla, simplemente tiene que hacer una llamada a esta página y leer su contenido
- Para esto puede valer usar la fución get_file_content
<?php $response = file_get_contents('http://localhost/servidor_rest/index.php'); $response = json_decode($response); echo "Saludo que viene del servidor $response"; ?>
|
La parte del cliente
- Curl
Înstalamos el comando o aplicación curl
sudo apt-get install curl
- Lo primero debemos tener instalada la librería de curl para php
sudo apt-get install php5-curl
- La forma de realizar una solicitudes es realizando una llamada completa a la web
- Ver el contenido del fichero como hemos hecho antes, es simplemente hacer una especie RPC (Invocación o llamada a métodos remotos).
- Usar curl con php es relativamente sencillo
http://php.net/manual/es/curl.examples-basic.php
- Para usarlo seguimos los siguientes pasos:
- Inicializamos una sesión cURL usando curl_init()
- Se establecen las opciones para la transferencia con curl_setopt() (Se especifican más abajo.
- Ejecutamos la sesión curl_exec() Aquí se puede recoger el resultado
- Cerramos la sesión con curl_close()
<?php $ch = curl_init("http://www.example.com/"); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); ?> |
- Una lista de las opciones más utilizadas
- Especificar la URL
- CURLOPT_URL EL la URL donde está el recurso al que queremos acceder. También se puede establecer en el método curl_init()
$llamada = curl_init(); curl_setopt($llamada, CURLOPT_URL, "http://localhost/servicio_rest/productos);
- O bien
$llamada = curl_init("http://localhost/servicio_rest/productos);
- CURLOPT_HEADER
- Para incluir las cabeceras de las respuestas (true o false
- Normalmente lo estableceremos a false, si solo nos interesa el contendio
- Se puede establecer a false, o pasar una cadena de caracteres tipo
$llamada = curl_init(); curl_setopt($llamada, CURLOPT_HEADER, false);
- CURLOPT_RETURNTRANSFER
- Para que en lugar de mostrar la respuesta, devuelva una cadena de caracteres de tipo string
$llamada = curl_init(); curl_setopt($llamada, CURLOPT_RETURNTRANSFER, true);
- CURLOPT_POST
- Establece una solicitud post. En este caso se usa la opción siguiente para pasar datos a la solicitud
$llamada = curl_init(); curl_setopt($llamada, CURLOPT_POST, true);
- CURLOPT_POSTFIELDS
- Para pasar los datos de la solicitud POST
curl_setopt($llamada, CURLOPT_POSTFIELDS, "usuario=dwes&pass=abc123.;");
- Alternativamente podemos usar el método http_build_query (...) pasándole un array asociativo
$llamada = curl_init(); $datosPost=['usuariol'=>'dwes', password' =>'abc123.' ]; ); $llamada = curl_init(); curl_setopt($llamada, CURLOPT_URL, "http://localhost/servicios_rest/login.php"); curl_setopt($llamada, CURLOPT_POST, true); curl_setopt($llamada, CURLOPT_POSTFIELDS, http_build_query($datosPost));
- CURLOPT_CUSTOMERREQUEST
- Establece la acción solicitada al servidor cuando esta no es ni GET (por defecto) ni POST (CURL_POST). Como ya hemos comentado suele ser "DELETE"o 'PUT' u otros tipos de peticiones HTTP menos comunes.
- Para pasar datos que se necesitaran en esta solicitud, se usa igualemnte la opción CURLOPT_POSTFIELDS
$llamada = curl_init(); $datos=['producto'=>'Cod_123dwes';stock=500]; ); curl_setopt($llamada, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($lamada, CURLOPT_POSTFIELDS, http_build_query($datos)); .... $datos=['producto'=>'Cod_123dwes' curl_setopt($llamada, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($cllamada, CURLOPT_POSTFIELDS, http_build_query($datos))
Ejemplo de consumir un servicio REST
|
- Haciendo las url amigables
- Solución en el servidor
- Solución en el cliente
- Obtener datos de la geografía española