Se familiarizarán o reforzarán los principios básicos para crear servicios RESTful y sabrán cómo aplicarlos con Go, un lenguaje ideal para la creación de servicios debido a su servidor HTTP integrado, los métodos (funciones) simples para la codificación XML y JSON, su alta disponibilidad y paradigma concurrente.
3. www.sgcampus.com.mx @sgcampus
CONTENIDO
• Primer API en Go
• Introducción de conceptos relacionados al uso de Go
• Uso del paquete http
• Servicios RESTful en Go
• Principios de arquitecturas REST. Diseño de APIs en Go
• Acceso y Uso de web services en Go
• Maneras de integrar otros web services para autenticación de manera segura
• Producción
• Estrategias de deployment
• Utilización de procesos para mantener el servidor corriendo, altamente accesible y
conectado con otros servicios
• Desempeño
• Estrategias para mantener el API vivo,responsivo y rápido en producción.
• Mecanismos de caching
• Seguridad
• SQL-injection
• Cross-site scripting
5. www.sgcampus.com.mx @sgcampus
APIs
• APIs: parte fundamental para el desarrollo web, mobile hoy en día
• Más fácil de crear y consumir que servicios precursores
• Todo el mundo tiene un API: bibliotecas, servicios (SaaS), datasets
• Estandarizan la comunicación entre cualesquiera dos (o más) plataformas
• Malos APIs: no inclusivos, semanticamente confusos, falta de consistencia
7. www.sgcampus.com.mx @sgcampus
Go: net/http
• El paquete net/http provee implementaciones de cliente y servidor HTTP
• Para hacer peticiones HTTP y HTTPS usamos Get, Head, Post y PostForm :
• El cliente debe cerrar el cuerpo (respuesta) cuando termina de usarlo:
8. www.sgcampus.com.mx @sgcampus
Paquete HTTP
• El paquete HTTP nos va a facilitar la tarea para construir un servicio
REST
• Además de servir vía HTTP, el paquete incluye otras utilidades como
cookie jars, clientes de configuración, reverse proxies, entre otros.
• http.server struct provee la base de todas las acciones de nuestro
servidor y parámetros.
• Dentro del servidor podemos establecer nuestra dirección TCP, routing
de peticiones, timeouts e información de headers.
• Go provee varios shortcuts (atajos) para invocar un servidor sin iniciar
directamente el struct.
9. www.sgcampus.com.mx @sgcampus
• Por ejemplo, cuando tenemos muchos valores por default, podríamos
usar el siguiente código:
• Y para ejecutar lo anterior, basta con poner:
11. www.sgcampus.com.mx @sgcampus
Lo anterior sirve para invocar un struct de servidor y establecer
las propiedades Addr y Handler.
Si se quiere tener control más granular de nuestro servidor, se
puede hacer de igual manera agregando las propiedades
pertinentes.
12. www.sgcampus.com.mx @sgcampus
Hello World!
• Objetivo: Desplegar un JSON en el Browser.
• Base:
• Este pedacito de código es lo mínimo que requerimos para desplegar
un string JSON por medio de HTTP.
13. www.sgcampus.com.mx @sgcampus
• Struct de respuesta, que contiene todos los datos que queremos
mandar al cliente (variable Message) después de tomarlo del API:
15. www.sgcampus.com.mx @sgcampus
• Al entrar a main(), establecemos una función de manejo de ruta
para responder a las peticiones a /api, misma que inicializa un
API struct con Hello,world!
• Cuando pasamos esto a un arreglo JSON (output) y después de
haber mandado el mensaje a nuestra clase iowriter (entrada/
salida), en este caso un valor del tipo http.ResponseWriter,
casteamos el valor a string.
• El último paso es una manera de mandar el arreglo por medio de
una función que espera recibir un string.
16. www.sgcampus.com.mx @sgcampus
Casting
• Go maneja el casting de tipos de manera muy simple, aplicando
el tipo como una función que delimita la variable objetivo.
• Por ejemplo, podemos casera un valor int64 a integer
simplemente delimitándolo con una función int(NuestroInt64)
• Aunque hay algunas excepciones: algunos tipos no pueden ser
convertidos directamente a otros y necesitan un paquete como
strconv para lograrlo.
17. www.sgcampus.com.mx @sgcampus
• Para verificar que todo está bien hecho, abrir el browser de su
preferencia y llamar al localhost:8080/api, que debe mostrar el
resultado de nuestro Hello World:
18. www.sgcampus.com.mx @sgcampus
Construyendo una Ruta
• Al hablar de routing en Go, hablamos de un multiplexer (o mux)
• En este caso, un multiplexer implica tomar URLs o patrones de URLs y
traducirlos a funciones internas.
• Visualícenlo como un mapeo simple de una petición a una función.
• Por ejemplo:
• Existen ciertas limitaciones con el ruteador de mux del paquete net/http,
pues, por ejemplo, no se puede generar un wildcard o una expresión
regular para una ruta.
• Otro problema es que no es bueno para responder a peticiones
dinámicas o aleatorias, lo que significa que no es capaz de aceptar/
identificar patrones.
20. www.sgcampus.com.mx @sgcampus
Soluciones
• Soluciones 3rd-party. Framework.
• Gorilla: web framework. Tiene un paquete que hace este tipo de
routing.
• También cuenta con otros beneficios como JSON-RPC, cookies
seguras y sesiones globales de datos.
• El paquete mux de Gorilla permite el uso de expresiones regulares
• http://www.gorillatoolkit.org
• http://www.gorillatoolkit.org/pkg/mux
21. www.sgcampus.com.mx @sgcampus
Soluciones
• Routes, de drone.io (https://github.com/drone/routes)
• Paquete dedicado solamente a routear
• Importante, porque es más eficiente que Gorilla
• Routing de URLs puede representar un cuello de botella en
aplicaciones grandes y/o escalables por el número de peticiones
• Para aplicaciones pequeñas, la diferencia es despreciable
22. www.sgcampus.com.mx @sgcampus
REST en Go
• API al último o primero?
• Depende de los fines: app o sitio de una sola página vs sitio
completo.
• Estrategias para diseñar un API
• Principios básicos de REST
• Creación de endpoints con Gorilla
• Tips para versionar aplicaciones
23. www.sgcampus.com.mx @sgcampus
REST
• REST : Representational state transfer
• Definición de formato: JSON, RSS, XML, binarios
• Es importante que el formato sea compatible con los datos. E.g. Es
usual ver datos traducidos de codificación Base64 y enviados vía JSON
• Tamaño: payload o cantidad de datos por transmitir
• El modelo de un API tiene que satisfacer las necesidades del cliente de
actualizar quitar u obtener un recurso o entrada en particular.
• Self-description: engloba 2 componentes de REST. 1) Debe incluir todo
lo necesario para satisfacer las peticiones del cliente y 2) información
sobre cómo manejar dicha información.
• Se evita la idea tradicional de conservar cookies o variables de sesión,
pues todo se maneja a través del API/web service.
24. www.sgcampus.com.mx @sgcampus
URIs y URLs
• Las URL o URI, en este caso, deben ser informativas. No sólo
deben dar información sobre los endpoints de datos, pero
también qué tipo de datos se debe esperar.
• No deben romperse en el futuro, a pesar de las versiones. Deben
ser consistentes.No aplicarlo se traduce en mal UX.
• Adelantarse a cambios: reaccionar a estos utilizando códigos de
status HTTP para indicar nuevas instancias y errores, en lugar
de sólo actualizarlos y romper el flujo anterior.