J.D Nicholls
Founding Full-Stack Web3 Engineer at @baxusco | Digital nomad 🎒 | Mentor 👨🏫 | Speaker 🗣️ | Developer 👨💻 | Creator of @proyecto26 #opensource #developer
Arquitectura orientada a Servicios
Es una arquitectura para diseñar servicios que me permite transmitir información de forma sencilla y eficiente entre un cliente y el servidor.
A un conjunto de servicios se le llama una API, se puede decir que una API es RESTful cuando cumple los principios de diseño de REST.
Un servicio REST tiene los siguientes componentes:
Un recurso se puede pensar como un objeto en OOP, es único y tiene una serie de atributos definidos por su tipo. Los recursos sirven para almacenar datos en el servidor y ofrecer un modelo simple para interactuar con ellos.
Por ejemplo en un videojuego un tipo de recurso podría ser los datos del jugador con su score y el ranking que ocupa dentro del juego, o puede ser la tabla de puntajes y los primeros 10 jugadores.
Los recursos son generalmente almacenados en una base de datos y se representan a través de formatos estándares concertados entre el cliente y el servidor.
La URL o URL es una dirección única que está asociada a un recurso en particular, el formato de las URIs es también definido de manera concertada entre el cliente y el servidor y ambos están al tanto de su formato.
http://www.mygame.com:8080/some/path?a=x&b=y
PROTOCOL
PORT
QUERY
DOMAIN
RESOURCE
https://www.mijuego.com/jugadores/rs221
Otra forma de enviar la identificación única de un recurso es a través de la sintaxis de parámetros de url. Sin embargo esta resulta menos conveniente ya que su funcionalidad no queda expuesta motores de búsqueda y generan diseños más difíciles de comprender para los desarrolladores.
https://www.mijuego.com/jugadores?id=rs221
Para interactuar con los recursos debemos utilizar mensajes; estos mensajes se apoyan fuertemente en la definición del protocolo http y sus verbos.
GET: Obtiene el valor de un recurso.
POST: Crea un recurso.
PUT: Actualiza o efectúa una operación que modifica un recurso.
DELETE: Elimina un recurso.
HEAD: A diferencia del GET, devuelve solo el header del recurso.
Permite recuperar el contenido de un recurso, usualmente lleva toda la información en la url ya que no suele contener datos privados o complejos de procesar.
Es el verbo más común, cuando una página web es cargada, el browser hace un request tipo GET al servidor que la almacena; este request contiene la URI del recurso así como cualquier parámetro opcional que se necesite.
Modifica el valor de un recurso, generalmente se utiliza para efectuar cualquier operación con el servidor que no sea recuperar.
Lleva los datos en el body del request utilizando algún formato acordado con el servidor (por ejemplo JSON) que es fácil de parsear e interpretar para efectuar la operación solicitada con los datos enviados.
No importa cuantas veces se efectúe un GET, el valor que este devuelve no debe cambiar a menos que el recurso en sí haya cambiado.
Un POST se puede efectuar cuantas veces se quiera y el resultado será “idempotente”, es decir que tendrá la misma estructura que el recurso inicial y permitirá seguir operando con este normalmente.
Significa que el servidor atiende el request una vez y se olvida del cliente hasta que este hace una petición de nuevo. No almacena el estado en cookies o en variables de la sesión que pueden hacer más engorroso y menos predecible el comportamiento de algunas operaciones sobre los recursos.
En lugar de comenzar inmediatamente con el desarrollo del backend, es buena práctica hacer un mockup de la API e integrar rápidamente con el equipo de front-end para que una vez desarrollado el empalme se puede depurar la facilidad de uso de la API y generar datos asociados a cuáles serán los servicios con mayor carga; estos servicios se podrían volver cuellos de botella más adelante.
Diseñe una API en apiary que le permita:
1. Recuperar el puntaje de un jugador.
2. Almacenar el puntaje de un jugador.
3. Obtener el puesto en el ranking de un jugador.
4. Obtener n puestos del ranking de manera paginada.
By J.D Nicholls
Founding Full-Stack Web3 Engineer at @baxusco | Digital nomad 🎒 | Mentor 👨🏫 | Speaker 🗣️ | Developer 👨💻 | Creator of @proyecto26 #opensource #developer