Usuario:ManuelRomero/ProgramacionWeb/WS/Rest

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

Imagen:Interfaz.png (No es una definición, pero sí un concepto importante y una realidad).
 * interfaz
 * Establecer los nombres para poder ofrecer nuestra aplicación y que interactúen con nosotros
 * Cómo recoger los datos para poderlos interpretar.
 * Cómo generar una salida para que nos la entiendas.
 * web
 * Red de páginas o recursos que se comunica por el protocolo http

Base de Rest

 * Rest no es un estándar, es una especificación basada en estándares
 * 1) http
 * 2) Protocolo sin estado
 * 3) Verbos o acciones en la solicitud GET, POST, DELETE, UPDATE y PUSH.
 * URL
 * 1) Representación de los recursos
 * 2) Tipos MIME : text/html, text/xml, text/json,...

operaciones CRUD: CREATE, READ, UPDATE, DELETE.
 * Estas acciones suelen ser comparados con las operaciones asociadas a la tecnología de base de datos,
 * Existen otra analogías como podemos ver en la tabla siguiente:

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

Por qué reescribir URL
http://misitioWeb/App1/Biblioteca/libros/indesx.php?id_libro=8456 http://misitioWeb/libro/8456 En cualquier caso está práctica nos permitiría, además de esto:
 * Para usar Rest, se suele hacer que la url que solicito sea lo que se llama amigable, es decir que no tiene porqué corresponder directamente al recurso que voy a localizar, sino que puedo establecer otro nombre más amigable para acceder a ese recurso.
 * Por ejemplo si quiere acceder a una página para obtener un libro determinado
 * Está claro que será más fácil ofrecer la url como
 * De lo que se trata es de escribir o invocar la segunda url y que realmente se ejecute la primera
 * 1) Permitir que las direcciones URL sean más amigables al usuario y los buscadores.
 * 2) Prevenir el “hot linking” o que usen tus imagenes en otros sitios.
 * 3) Esconder las direcciones web reales de tu servidor a los usuarios.
 * 4) Redirigir de forma transparente las peticiones web.

URI y URL's amigables
http://localhost/tienda/producto.php La URL es http://localhost/tienda.php El URI o recurso es producto.php
 * Una URL es el localizador de ese recurso, por ejemplo

http://programandolo.blogspot.com.es/2013/06/reglas-de-reescritura-parte-1.html#more http://localhost/reescritura/paginaAmigosConfianza.php&dato=pedro
 * 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 traducción
 * supongamos que en nuestro proyecto tenemos la URL

http://localhost/reescritura/amigo/pedro
 * Es claro ver que a alguien le sería mas claro escribir

/usr/sbin/apachectl -t -D DUMP_MODULES sudo a2enmod rewrite sudo service apache2 restart
 * 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
 * Nos listará los módulos instalados. Buscamos rewrite'
 * En caso de no tenerlo instalado lo instalamos
 * Después reiniciamos el servicio
 * 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

 AllowOverride All   AllowOverride All  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] En este caso tenemos la expresión regunar ^(.+)$ http://localhost/servicio_rest/productos/1 http://localhost/servicio_rest/index.php?url=productos/1
 * Esto sería hacerlo para todos
 * Esto sería hacerlo para una parte de mi directorio
 * Después de modificar un fichero de configuración, hay que rebotar el servicio
 * Ahora escribimos las reglas de
 * 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.
 * 1) Estamblecemos /servicio_rest como directorio base
 * 2) 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
 * 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

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


 * 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
 * Lógicamente en este caso estamos haciendo una solicitud GET

La parte del cliente
Înstalamos el comando o aplicación curl sudo apt-get install curl sudo apt-get install php5-curl sudo apt-get install php-curl http://php.net/manual/es/curl.examples-basic.php
 * Si desde el cliente queremos realizar una invocación que no sea siempre GET, puediendo realizar invocaciones PUT, POST, .... vamos a usar la librería Curl
 * Curl
 * Lo primero debemos tener instalada la librería de curl para php
 * En php7
 * 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
 * Para usarlo seguimos los siguientes pasos:
 * 1) Inicializamos una sesión cURL usando curl_init
 * 2) Se establecen las opciones para la transferencia con  curl_setopt (Se especifican más abajo.
 * 3) Ejecutamos la sesión curl_exec Aquí se puede recoger el resultado
 * 4) Cerramos la sesión con curl_close


 * 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
 * O bien


 * 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


 * CURLOPT_RETURNTRANSFER
 * Para que en lugar de mostrar la respuesta, devuelva una cadena de caracteres de tipo string

curl_setopt($llamada, CURLOPT_POSTFIELDS, "usuario=dwes&pass=abc123.;");
 * CURLOPT_POST
 * Establece una solicitud post. En este caso se usa la opción siguiente para pasar datos a la solicitud
 * CURLOPT_POSTFIELDS
 * Para pasar los datos de la solicitud POST
 * Alternativamente podemos usar el método http_build_query (...) pasándole un array asociativo


 * 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