SlideShare una empresa de Scribd logo
www.sgcampus.com.mx @sgcampus
www.sgcampus.com.mx
@sgcampus
Verónica López
@maria_fibonacci
Cómo crear un RESTful API con Go
www.sgcampus.com.mx @sgcampus
Objetivo: Programar y poner en producción
servicios web rápidos, escalables y creación de
RESTful APIs de alto desempeño con Go.
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
www.sgcampus.com.mx @sgcampus
Prerequisitos
• Windows, Linux, MacOS X
• Go instalado (yum, apt-get)
• MySQL
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
www.sgcampus.com.mx @sgcampus
Go
Lenguaje pensado para servidores.
Servidor http incluído
Métodos simples para el encoding de datos en XML y JSON
Altamente disponible
Concurrente
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:
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.
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:
www.sgcampus.com.mx @sgcampus
Go structs
• Structs: colecciones (tipadas) de campos;sirven para agrupar datos para crear registros.
• Ejemplo:
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.
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.
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:
www.sgcampus.com.mx @sgcampus
Finalmente, tenemos que configurar nuestra función principal (main) para responder a
una ruta específica y entregar una respuesta JSON de la siguiente manera:
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.
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.
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:
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.
www.sgcampus.com.mx @sgcampus
EJEMPLO
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
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
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
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.
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.
www.sgcampus.com.mx @sgcampus
EJEMPLO
www.sgcampus.com.mx @sgcampus
JSON
Ejemplo de cómo Go puede mandar y recibir JSONs usando solamente los paquetes del core del lenguaje:
www.sgcampus.com.mx @sgcampus
Deployment/Producción
• Métodos tradicionales, servidores
• Amazon Web Services (interactuando directamente con la
interface/API. Paquete goamz.
• Docker. Contenedores
• Binarios en CDNs
www.sgcampus.com.mx @sgcampus
Adicional
• Seguridad. SQL injection, cross-site scripting
• Performance
• Autenticación
• Personalización
www.sgcampus.com.mx @sgcampus
Conclusión
• Cuestiones a considerar:
• API responsiva
• Regresar códigos de status apropiados
• Headers
• Buen UX
• Seguridad
• Performance
• Detalles particulares (stateless vs stateful, etc)
www.sgcampus.com.mx @sgcampus
¡PREGUNTAS!

Más contenido relacionado

La actualidad más candente

Gestores de base de datos
Gestores de base de datosGestores de base de datos
Gestores de base de datos
Edwin Johan Alvarez
 
Cuadro comparativo de SMBD
Cuadro comparativo de SMBD Cuadro comparativo de SMBD
Cuadro comparativo de SMBD Jazmin Glez.
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
BEEVA_es
 
1-2 Arquitectura base de datos.pptx
1-2 Arquitectura base de datos.pptx1-2 Arquitectura base de datos.pptx
1-2 Arquitectura base de datos.pptx
jose651254
 
Cuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMSCuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMS
Hugo Alberto Rivera Diaz
 
LinkedIn Data Infrastructure Slides (Version 2)
LinkedIn Data Infrastructure Slides (Version 2)LinkedIn Data Infrastructure Slides (Version 2)
LinkedIn Data Infrastructure Slides (Version 2)
Sid Anand
 
10 sistemas gestores de base de datos
10 sistemas gestores de base de datos10 sistemas gestores de base de datos
10 sistemas gestores de base de datos
Gusttavo Nipas
 
Administracion de base de datos postgresql
Administracion de base de datos postgresqlAdministracion de base de datos postgresql
Administracion de base de datos postgresql
Alvaro Paz
 
PREGUNTAS DE EXAMEN
PREGUNTAS DE EXAMENPREGUNTAS DE EXAMEN
PREGUNTAS DE EXAMEN
Alfa Mercado
 
Servicios web
Servicios webServicios web
Intro To MongoDB
Intro To MongoDBIntro To MongoDB
Intro To MongoDB
Alex Sharp
 
Seguridad y protección en los s.o
Seguridad y protección en los s.oSeguridad y protección en los s.o
Seguridad y protección en los s.o
JESÚS GUERRA
 
Ventajas y desventajas de las bdoo
Ventajas y desventajas de las bdooVentajas y desventajas de las bdoo
Ventajas y desventajas de las bdoo
Nerhys Palacios
 
React native
React nativeReact native
React native
Diego Navarré
 
El DBA y sus funciones
El DBA y sus funcionesEl DBA y sus funciones
El DBA y sus funciones
kevinchontarivera
 
Tipos y ámbitos de grupo (windows server
Tipos y ámbitos de grupo (windows serverTipos y ámbitos de grupo (windows server
Tipos y ámbitos de grupo (windows servercesartg65
 
Diagramas de caso de uso
Diagramas de caso de usoDiagramas de caso de uso
Diagramas de caso de uso
Tensor
 
phpMyAdmin con Xampp
phpMyAdmin con XamppphpMyAdmin con Xampp
phpMyAdmin con Xampp
LeccionesWeb
 

La actualidad más candente (20)

Gestores de base de datos
Gestores de base de datosGestores de base de datos
Gestores de base de datos
 
Cuadro comparativo de SMBD
Cuadro comparativo de SMBD Cuadro comparativo de SMBD
Cuadro comparativo de SMBD
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
1-2 Arquitectura base de datos.pptx
1-2 Arquitectura base de datos.pptx1-2 Arquitectura base de datos.pptx
1-2 Arquitectura base de datos.pptx
 
MYSQL
MYSQLMYSQL
MYSQL
 
Cuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMSCuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMS
 
LinkedIn Data Infrastructure Slides (Version 2)
LinkedIn Data Infrastructure Slides (Version 2)LinkedIn Data Infrastructure Slides (Version 2)
LinkedIn Data Infrastructure Slides (Version 2)
 
10 sistemas gestores de base de datos
10 sistemas gestores de base de datos10 sistemas gestores de base de datos
10 sistemas gestores de base de datos
 
Administracion de base de datos postgresql
Administracion de base de datos postgresqlAdministracion de base de datos postgresql
Administracion de base de datos postgresql
 
PREGUNTAS DE EXAMEN
PREGUNTAS DE EXAMENPREGUNTAS DE EXAMEN
PREGUNTAS DE EXAMEN
 
Servicios web
Servicios webServicios web
Servicios web
 
Java Threads (Hilos en Java)
Java Threads (Hilos en Java)Java Threads (Hilos en Java)
Java Threads (Hilos en Java)
 
Intro To MongoDB
Intro To MongoDBIntro To MongoDB
Intro To MongoDB
 
Seguridad y protección en los s.o
Seguridad y protección en los s.oSeguridad y protección en los s.o
Seguridad y protección en los s.o
 
Ventajas y desventajas de las bdoo
Ventajas y desventajas de las bdooVentajas y desventajas de las bdoo
Ventajas y desventajas de las bdoo
 
React native
React nativeReact native
React native
 
El DBA y sus funciones
El DBA y sus funcionesEl DBA y sus funciones
El DBA y sus funciones
 
Tipos y ámbitos de grupo (windows server
Tipos y ámbitos de grupo (windows serverTipos y ámbitos de grupo (windows server
Tipos y ámbitos de grupo (windows server
 
Diagramas de caso de uso
Diagramas de caso de usoDiagramas de caso de uso
Diagramas de caso de uso
 
phpMyAdmin con Xampp
phpMyAdmin con XamppphpMyAdmin con Xampp
phpMyAdmin con Xampp
 

Similar a Cómo crear un RESTful API con Go

Web framework ligeros y micros en java barcamp 2014
Web framework ligeros y micros en java   barcamp 2014Web framework ligeros y micros en java   barcamp 2014
Web framework ligeros y micros en java barcamp 2014
Carlos Camacho
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
Rodolfo Finochietti
 
Seguridad y optimización en Magento
Seguridad y optimización en MagentoSeguridad y optimización en Magento
Seguridad y optimización en Magento
Devopensource
 
S7-DAW-2022S1.pptx
S7-DAW-2022S1.pptxS7-DAW-2022S1.pptx
S7-DAW-2022S1.pptx
Luis Fernando Aguas Bucheli
 
Escalando WordPress
Escalando WordPressEscalando WordPress
Escalando WordPress
Fernando Tellado
 
Introducción a la programación en internet
Introducción a la programación en internetIntroducción a la programación en internet
Introducción a la programación en internet
cristinaig123
 
Derribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayDerribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev Day
Plain Concepts
 
Evento de Partners SiteGround "Escalando WordPress"
Evento de Partners SiteGround "Escalando WordPress"Evento de Partners SiteGround "Escalando WordPress"
Evento de Partners SiteGround "Escalando WordPress"
SiteGround España
 
Integrando AngularJS y drupal
Integrando AngularJS y drupalIntegrando AngularJS y drupal
Integrando AngularJS y drupal
Iván Campaña Naranjo
 
ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3
Rodolfo Finochietti
 
Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007
guestd24c393
 
Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007
guest976d083
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
Eduard Tomàs
 
ASP.NET MVC Core by Eduard Tomàs
ASP.NET MVC Core by Eduard TomàsASP.NET MVC Core by Eduard Tomàs
ASP.NET MVC Core by Eduard Tomàs
Plain Concepts
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corporacion de Industrias Tecnologicas S.A.
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePoint
Adrian Diaz Cervera
 
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Francisco Javier Toscano Lopez
 
Define y desarrolla tu primera api
Define y desarrolla tu primera apiDefine y desarrolla tu primera api
Define y desarrolla tu primera api
CloudAppi
 

Similar a Cómo crear un RESTful API con Go (20)

Web framework ligeros y micros en java barcamp 2014
Web framework ligeros y micros en java   barcamp 2014Web framework ligeros y micros en java   barcamp 2014
Web framework ligeros y micros en java barcamp 2014
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Seguridad y optimización en Magento
Seguridad y optimización en MagentoSeguridad y optimización en Magento
Seguridad y optimización en Magento
 
S7-DAW-2022S1.pptx
S7-DAW-2022S1.pptxS7-DAW-2022S1.pptx
S7-DAW-2022S1.pptx
 
Escalando WordPress
Escalando WordPressEscalando WordPress
Escalando WordPress
 
Introducción a la programación en internet
Introducción a la programación en internetIntroducción a la programación en internet
Introducción a la programación en internet
 
Derribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayDerribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev Day
 
Evento de Partners SiteGround "Escalando WordPress"
Evento de Partners SiteGround "Escalando WordPress"Evento de Partners SiteGround "Escalando WordPress"
Evento de Partners SiteGround "Escalando WordPress"
 
Comenzando con GWT
Comenzando con GWTComenzando con GWT
Comenzando con GWT
 
Integrando AngularJS y drupal
Integrando AngularJS y drupalIntegrando AngularJS y drupal
Integrando AngularJS y drupal
 
ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3
 
Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007
 
Todomir
TodomirTodomir
Todomir
 
Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
ASP.NET MVC Core by Eduard Tomàs
ASP.NET MVC Core by Eduard TomàsASP.NET MVC Core by Eduard Tomàs
ASP.NET MVC Core by Eduard Tomàs
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePoint
 
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
 
Define y desarrolla tu primera api
Define y desarrolla tu primera apiDefine y desarrolla tu primera api
Define y desarrolla tu primera api
 

Más de Software Guru

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
Software Guru
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
Software Guru
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
Software Guru
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
Software Guru
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
Software Guru
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
Software Guru
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
Software Guru
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
Software Guru
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
Software Guru
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
Software Guru
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
Software Guru
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
Software Guru
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
Software Guru
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Software Guru
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
Software Guru
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Software Guru
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
Software Guru
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
Software Guru
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
Software Guru
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
Software Guru
 

Más de Software Guru (20)

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
 

Último

leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
Leidyfuentes19
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
Luis Enrique Zafra Haro
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
IsabellaRubio6
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
Fernando Villares
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
cristianrb0324
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
thomasdcroz38
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
CrystalRomero18
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
PABLOCESARGARZONBENI
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
vazquezgarciajesusma
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
ManuelCampos464987
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
coloradxmaria
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
ItsSofi
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
cj3806354
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
jjfch3110
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
DiegoCampos433849
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
Emilio Casbas
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
SamuelRamirez83524
 

Último (20)

leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
 

Cómo crear un RESTful API con Go

  • 2. www.sgcampus.com.mx @sgcampus Objetivo: Programar y poner en producción servicios web rápidos, escalables y creación de RESTful APIs de alto desempeño con Go.
  • 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
  • 4. www.sgcampus.com.mx @sgcampus Prerequisitos • Windows, Linux, MacOS X • Go instalado (yum, apt-get) • MySQL
  • 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
  • 6. www.sgcampus.com.mx @sgcampus Go Lenguaje pensado para servidores. Servidor http incluído Métodos simples para el encoding de datos en XML y JSON Altamente disponible Concurrente
  • 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:
  • 10. www.sgcampus.com.mx @sgcampus Go structs • Structs: colecciones (tipadas) de campos;sirven para agrupar datos para crear registros. • Ejemplo:
  • 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:
  • 14. www.sgcampus.com.mx @sgcampus Finalmente, tenemos que configurar nuestra función principal (main) para responder a una ruta específica y entregar una respuesta JSON de la siguiente manera:
  • 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.
  • 26. www.sgcampus.com.mx @sgcampus JSON Ejemplo de cómo Go puede mandar y recibir JSONs usando solamente los paquetes del core del lenguaje:
  • 27. www.sgcampus.com.mx @sgcampus Deployment/Producción • Métodos tradicionales, servidores • Amazon Web Services (interactuando directamente con la interface/API. Paquete goamz. • Docker. Contenedores • Binarios en CDNs
  • 28. www.sgcampus.com.mx @sgcampus Adicional • Seguridad. SQL injection, cross-site scripting • Performance • Autenticación • Personalización
  • 29. www.sgcampus.com.mx @sgcampus Conclusión • Cuestiones a considerar: • API responsiva • Regresar códigos de status apropiados • Headers • Buen UX • Seguridad • Performance • Detalles particulares (stateless vs stateful, etc)