\documentclass[a4paper]{article}
\usepackage{fullpage}
\usepackage[spanish]{babel}
%\usepackage[latin1]{inputenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{colortbl}
\usepackage {html}
\usepackage {hthtml}


\begin{document}
\begin{large}
\noindent
{\bf Prácticas con REST }  \\
Servicios Telemáticos 2015-2016\\
Grado en Ingeniería Telemática  \\
Universidad Rey Juan Carlos\\ 
\hturl{http://gsyc.urjc.es}
\hrule
\end{large}

\vspace{0.5cm}


%\subsection*{Cambios en el documento}
%\begin{itemize}
%\item
%\end{itemize}


\section*{Observaciones}
\begin{itemize}
\item
%Crea el fichero  \verb|~/st/practica02.txt|,
%que contendrá la memoria que escribas sobre  este segundo bloque de
%prácticas. 
%En la primera línea, indica tu nombre y login. 
%
%En la memoria no es necesario que vuelvas a escribir el enunciado. 
%
%Cuando la ejecución de un apartado de una práctica muestre algo en stdout, es necesario que copies 
%esta salida y la pegues en la memoria.
%%
%%Si bien  es probable que este fichero lo dejes vacío
%%(puesto que cuando la práctica consista en un script,
%%en la memoria no es necesario escribir nada, a menos que tengas
%%algún motivo para indicar algo)
%
Crea el directorio \verb|~/st/practica05| donde escribirás el resto de ficheros de esta práctica. 
Recuerda que la recogida de las prácticas 
se hará automáticamente el dia del examen, así que es muy importante que respetes al pie de la letra todos los
nombres de ficheros y directorios que indiquen todos los enunciados. 
%\item
%Haz que este directorio sea un repositorio git y vete metiendo en él todos los scripts, según los vayas escribiendo.

\end{itemize}

\section*{Práctica 5.1 jsonplaceholder }

\htlink{jsonplaceholder}{http://jsonplaceholder.typicode.com} es un sitio web para aprender a programar con REST y 
facilitar la depuración de programas. Ofrece una API para acceder a recursos 
típicos como usuarios, mensajes de un foro y fotos. Consulta el API descrito en su página principal y:

    \begin{enumerate}
    \item
Crea el script
\verb|~/st/practica05/foro.py| para consultar este servicio web





    \item
Si se invoca sin parámetros, mostrará por salida estándar todos los mensajes, con un formato
similar a este


  \begin{footnotesize}
  \begin{verbatim}
De: Bret
nesciunt iure omnis dolorem tempora et accusantium
-----------------------
consectetur animi nesciunt iure dolore
enim quia ad
veniam autem ut quam aut nobis
et est aut quod aut provident voluptas autem voluptas

De: Bret
optio molestias id quia eum
-----------------------
quo et expedita modi cum officia vel magni
doloribus qui repudiandae
vero nisi sit
quos veniam quod sed accusamus veritatis error

De: Antonette
et ea vero quia laudantium autem
-----------------------
delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus
accusamus in eum beatae sit
vel qui neque voluptates ut commodi qui incidunt
ut animi commodi
  \end{verbatim}
  \end{footnotesize}

Observa que aparece el \emph{username}, el título del mensaje, una línea en texto
plano, el cuerpo y una línea en blanco
    \item
Si se invoca con la opción \verb|-u <NOMBRE_USUARIO> --user <NOMBRE_USUARIOS>|, por 
ejemplo \verb|-u bret|, mostrará solo los mensajes correspondientes a este 
\emph{username}

Esta opción será insensible a mayúsculas, esto es, el resultado será el mismo para
por ejemplo
\verb|bret|, \verb|Bret| o \verb|BrEt|

    \item
Si el usuario no existe, el script debe mostrar un mensaje de error adecuado por stderr




    \end{enumerate}


\section*{Práctica 5.2 holamundo REST}

Prueba un holamundo en flask, como el de las transparencias


\section*{Práctica 5.3 servidor REST}
Escribe un script
\verb|~/st/practica05/server01.py|
que al recibir una petición GET al recurso \verb|posts| se comporte
igual que 
\htlink{jsonplaceholder}{http://jsonplaceholder.typicode.com/posts} 

Añade también el recurso 
\verb|/posts/n|
donde n es el número de mensaje, por ejemplo
\verb|/posts/3|

Siempre imitando el comportamiento de jsonplaceholder. Los valores
a devolver por tu servidor pueden ser cualquiera, con tal de
que respeten el formato de jsonplaceholder. No hagas que tu servidor
consulte a su vez a jsonplaceholder, simplemente fija los valores
a devolver como una constante en el fuente.

\section*{Práctica 5.4 servidor REST}
Escribe un script
\verb|~/st/practica05/server02.py|
incrementando el script anterior
con el recurso \verb|/users|

\section*{Práctica 5.5 servidor REST}

Escribe un script
\verb|~/st/practica05/server03.py|
incrementando el script anterior
con el recurso 
\verb|/posts?userId=n|
por ejemplo
\verb|/posts?userId=1|


Comprueba que tu script
\verb|~/st/practica05/foro.py| puede consultar tu servidor, con solo cambiar la URI


\section*{Práctica 5.6 Cambio de moneda}


Escribe un script
\verb|~/st/practica05/exchange.py|
que devolverá el tipo de cambio del bitcoin para diversas divisas, según la siguiente especificación.
\begin{itemize}

\item
Cada divisa tiene un código ISO 4217, que es un identificador de 3 letras mayúsculas. 
Por ejemplo USD (United States Dollar) para el dólar, EUR para el euro, GBP para la libra esterlina,
etc. El código ISO 4217 del bitcoin es XBT, aunque es muy habitual usar las siglas BTC.

\item
El precio de una divisa frente a otra se indica mediante la concatenación de sus dos códigos ISO 4217.
La primera se denomina \emph{divisa base} 
y la segunda,
\emph{divisa cotizada}.
Por ejemplo EURUSD = 1.13. Aquí la divisa base es el euro, y la cotizada, el dólar. Este valor (1.13) indica cuántas 
unidades de la divisa cotizada hacen falta para 
comprar una unidad de la divisa base. Dicho de otro modo, la primera moneda es la que queremos
y la segunda, la que tenemos, la que usamos para pagar.


\item
Nos interesa tomar como referencia el precio del bitcoin en yuanes chinos (CNY) en la casa de
cambio btcchina, por ser una de las de mayor volumen mundial. Este precio podemos
obtenerlo mediante una petición a 
\verb|https://data.btcchina.com/data/ticker|
pasando como parámetro la \emph{query string} \verb|market=btccny|. La respuesta
devuelve varios precios, tomaremos el valor \emph{buy}.

Pero queremos conocer otros \emph{pares}, como XBTEUR, XBTUSD y algunos otros, calculados
siempre a partir del precio BTCCNY. 

\item
Queremos saber el precio del bitcoin expresado en:
EUR, USD, GPB, CAD, JPY, AUD, CHF y RUB. Para ello, primero averiguamos el precio en yuanes
de esta moneda, por ejemplo CNYEUR, y luego calcularmos el precio XBTCNY.

\item
Para conocer el precio CNYEUR, haremos una petición a
\verb|http://api.fixer.io/latest|
pasando como argumento \verb|base=CNY|. Usa tu navegador web para ver el formato
que devuelve fixer.io.

\item
BTC China ofrece algunos pares directamente, pero
no nos interesan (la baja liquidez provoca alteraciones), queremos calcularlo siempre a partir
del precio en yuanes.

\item
La URI de tu servidor será

\verb|/exchange/XBTEUR|

\verb|/exchange/XBTUSD|

\verb|/exchange/XBTGBP|

etc

\item
La respuesta será un valor json (una cadena) con el tipo de cambio solicitado. El cliente podrá 
pasar el parámetro \verb|amount=5.23|. Por ejemplo
\verb|/exchange/XBTEUR?amount=5.23|. Esto significará que el cliente está preguntando cuántos
euros hacen falta para comprar 5.23 bitcoins.

\end{itemize}


\section*{Práctica 5.7 Cambio de moneda, con caché}

Modifica la práctica del apartado anterior para que la respuesta
sea un objeto JSON, y el servidor
mantenga una caché con las respuestas

\begin{itemize}
\item
La respuesta será un objeto JSON. Devolverá un par cuya clave serán
el cruce de divisas solicitado, y el valor, el precio. Por ejemplo XBTGBP : 306.03

\item
Si el cliente hizo una petición con el parámetro \emph{amount}, el
objeto incluirá un par con la cantidad de bitcoins solicitada y 
otro par con el la cantidad de divisa cotizada necesaria.

Ejemplo: para la petición XBTGPB?amount=5.23, con un precio del bitcoin
en libras de 306.03,  la respuesta sería
XBTGPB : 306.03, XBT : 5.23, GBP : 1600.5369

\item
La caché estará en memoria. Cuando el servidor consulte a BTC China
o a fixer.io, guardará la respuesta y la fecha y hora de la respuesta.

\item
Cuando el servidor reciba una petición, si ya tiene una respuesta
en caché, y la respuesta no es obsoleta, servirá el valor 
almacenado en caché.

\item
Un valor se considerará obsoleto si tiene una antiguedad superior
a cierto número de minutos. Esta antiguedad estará indicada
mediante constantes definidas en las primeras líneas del código
fuente. Para el precio del bitcoin, el valor por omisión
será de 5 minutos. Para el precio de las divisas, el valor por
omisión será de 1440 minutos (24 horas). 


Obviamente, para poder probar que funcione correctamente, deberás
usar valores mucho menores.

El número de minutos podrá tener decimales. Por ejemplo, 0.5 minutos 
será un valor admisible.


\end{itemize}

\end{document}
