Está en la página 1de 10

Instituto Tecnológico de Tepic

Ingeniería en Sistemas Computacionales
Programación Web
Aplicación Web Para La Administración De Información Escolar.

Cómo se implementa la comunicación e inserción en la base de datos.
De acuerdo con los autores Doxsey (2016) y Balbaert (2014) Go es un lenguaje de programación de
propósito general muy potente, que permite realizar aplicaciones de servidor, escritorio y web con un
alto rendimiento optimizando los recursos de hardware disponibles al máximo. En este caso en
específico hablaremos del uso de Go para las aplicaciones web y cómo es que mediante su uso,
podremos implementar las características del proyecto descritas anteriormente y solicitadas en el
problema.
Esto es, vamos a definir de qué manera es que se puede realizar la conexión con la base de datos para
insertar y extraer información desde un formulario web.
Go proporciona por su propia cuenta por medio de las bibliotecas y paquetes todos los servicios
necesarios para lograr poner en ejecución servicios potentes para correr aplicaciones web. La mayoría
de estos servicios pueden correr de una forma muy sencilla y con solo unas cuantas líneas de código.
Adentrándose a la operatividad que Go tiene al momento de manejar peticiones por parte del cliente,
se realiza un proceso, el cual los autores Sheong (2016) y Varghese (2015) lo plantean de manera muy
similar y es el siguiente:
El código en el paquete net recibe la solicitud por parte del cliente, cuando detecta que es una
petición http lo manda al paquete http, este paquete es quien contiene elementos como el
DefaultServeMux, el cual la forma en que lo maneja es que recibe la petición y ve que es lo que la
petición desea hacer dependiendo del patrón reconocido en la URL, de esta forma pasa la tarea al
handler, el cual dependiendo el tipo de petición manda a llamar a la función que corresponde para
manejar los datos. Una vez que la función handler entra en acción, esta se encarga de hacer todas las
operaciones programadas por el desarrollador, si se incluye conexión con una base de datos, como por
ejemplo MySQL, en este caso el encargado es el paquete database mediante la biblioteca sql, que
conecta con MySQL y permite manejar y consultar datos de la BD, realiza todas las operaciones
necesarias con los datos para que el handler, una vez procesados devuelva al paquete http para que
retorne al cliente la petición requerida.

Página 17 de 26

Func Handle func Handle(pattern string. que mediante la función ListenAndServe se especifica. Ahora bien. Por lo tanto responde a las solicitudes que el DefaultServeMux reconoce mediante ese patrón. Aunque el paquete proporciona acceso a redes primitivas de bajo nivel. resolución de nombres de dominio y sockets de dominio de Unix. dentro del código las llamadas funciones manejadoras son muy importantes. merecen mención aparte.com/go-sql-driver/mysql" import "golang. package main import "database/sql" import _ "github. Lo primero es la importación de las librerías que como sabemos. Mediante este se hace la Página 18 de 26 . Para ello primero necesita ser definido un patrón utilizando Func Handle. Acorde a la documentación consultada The Go Team (2016) en su sitio oficial: Paquete NET Uno de los paquetes más importantes y útiles en Go es el paquete NET proporciona una interfaz portátil de entrada/salida para la red. la mayoría de los clientes necesitarán sólo la interfaz básica proporcionada por el dial. handler Handler) Handle es el encargado de registrar el controlador para el patrón dado en el DefaultServeMux.org/x/crypto/bcrypt" import "net/http" Las últimas 2 bibliotecas. Paquete HTTP El paquete HTTP provee implementaciones de cliente y servidor para el protocolo HTTP. ya que gracias a ellas se redirigen las solicitudes y se atienden especificamente de acuerdo con lo que hay en la URL. por sus capacidades para permitir levantar el servidor web mismo. que permitirá definir una o varias funciones para controlar la respuesta. escuchar y aceptar las funciones. UDP.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. De acuerdo con la manera en que Go responde a las solicitudes. Ahora veremos poco a poco como es que esto está implementado a nivel de código. incluyendo TCP/IP. se requiere un componente de tipo Mux instanciado. Esto se hace de la manera siguiente. se necesita utilizar en la aplicación.

html") return } username := req. Este debe mandar llamar desde el main de nuestro código en Go. tal como se ve a continuación. se pueden ver a continuación. req *http. err = sql. Las 3 funciones manejadoras que hay en main. En esta misma sección se implementa un mecanismo para detectar si hay algún problema que no permita abrir la conexión. nil) } Puede observarse que en el main. redirección a las funciones manejadoras específicas.Close() err = db.Error()) } defer db. y entonces genera un error. homePage) http. handler func(ResponseWriter.Error()) } http.FormValue("username") password := req. además de constituir las HandleFunc con sus patrones respectivos.Ping() if err != nil { panic(err. lo que significa que se tendrá que utilizar un componente de este paquete llamado DefaultServeMux. ListenAndServe inicia un servidor HTTP con una dirección y el Handler dado para controlar el funcionamiento del servidor.ResponseWriter.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. "login.Method != "POST" { http. Es en su interior donde se programa la respuesta que se habrá de producir al reconocer una solicitud que obedece a ese patrón. por ejemplo la función loginPage. req. "root:Redes2016@/test") if err != nil { panic(err. *Request)) HandleFunc registra la función del Handler para el patrón dado en el DefaultServeMux. Por defecto. de manera que nos permita manipular y ejecutar consultas desde el mismo Go. especificando el nombre y el usuario y contraseña de la misma.Open("mysql".ListenAndServe(":8080". Func HandleFunc y ListenAndServe func HandleFunc(pattern string. Es en esta parte del código donde se abre la conexión con la base de datos. func main() { db. si no se especifica un handler éste es normalmente nil(nulo).HandleFunc("/signup".FormValue("password") Página 19 de 26 .ServeFile(res. Si ese es el caso Handle y HandleFunc agregan manejadores a DefaultServeMux. Cada una tiene una función diferente. que se muestra a continuación: func loginPage(res http.Request) { if req. signupPage) http.HandleFunc("/".HandleFunc("/login". también se hace algo muy importante. loginPage) http.

sino lo es. "Server error. 301) return } res. despliega el formulario para rellenar los datos del usuario y contraseña. req. func signupPage(res http.QueryRow("SELECT username FROM users WHERE username=?".Request) { if req.CompareHashAndPassword([]byte(databasePassword).GenerateFromPassword([]byte(password).Scan(&databaseUsername. req *http. Caso contrario lo regresa al formulario de inicio con código de error 301.Method != "POST" { http. req.FormValue("username") password := req. "index. 301) return } err = bcrypt.ServeFile(res. Si se trata del otro tipo de solicitud.ErrNoRows: hashedPassword. &databasePassword) if err != nil { http.DefaultCost) if err != nil { http. Se compara la contraseña con una función cifrada y si todo está correcto entonces se accede a la siguiente pantalla.html") return } username := req. 500) Página 20 de 26 .Write([]byte("Hello" + databaseUsername)) } Esta se encarga de que al detectar que se recibe una solicitud. var databaseUsername string var databasePassword string err := db. username).ResponseWriter.QueryRow("SELECT username. password FROM users WHERE username=?". req. revisar si esta es de POST. ya sea para realizar la unión de alumnos con grupos u otros formularios similares.Request) { http. err := bcrypt.".Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. []byte(password)) if err != nil { http. bcrypt. pues simplemente despliega la página principal. "/login".Redirect(res.ServeFile(res.Redirect(res.Error(res. es porque el formulario se ha llenado y por lo tanto procede a realizar una consulta a la base de datos para traer el usuario y contraseña indicados al momento de llenar el formulario. req. "signup. func homePage(res http.ResponseWriter. donde se le despliega un mensaje de bienvenida al usuario. unable to create your account.FormValue("password") var user string err := db. "/login". username).Scan(&user) switch { case err == sql. req *http.html") } Esta función tiene un comportamiento mas deducible de su mismo código. Esto es básicamente a lo que se hace al momento de insertar información a una base de datos escolar y visualizarla.

req. 500) return default: http.com/go-sql-driver/mysql" import "golang.org/x/crypto/bcrypt" import "net/http" var db *sql. se verá un código ejemplo de un sitio básico con go que realiza una conexión con una base de datos en SQLite. Código ejemplo Una vez explicado el funcionamiento individual de cada paquete importante para el desarrollo del proyecto.Write([]byte("User created!")) return case err != nil: http. 301) } } Por último está la función para el control de Singup.Method != "POST" { http. "signup.". lo que le permite brindar la funcionalidad dicha.ResponseWriter. Para ello tiene un comportamiento muy similar al de la página de login.Request) { if req. como bien podría ser el registro de un nuevo alumno o cualquier otro dato que se inserte en la base de datos. req *http.DB var err error func signupPage(res http. hashedPassword) if err != nil { http. username.html") return } Página 21 de 26 . "Server error. Código: package main import "database/sql" import _ "github. gracias a la cual se puede realizar el registro de un nuevo usuario y contraseña en la base de datos. "Server error.Redirect(res. unable to create your account. "/".". La diferencia fundamental está en que realiza consultas de INSERT en la base de datos. unable to create your account.Exec("INSERT INTO users(username. 500) return } res. return } _. password) VALUES(?. req.ServeFile(res. err = db. ?)".Error(res.Error(res.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar.

req. password FROM users WHERE username=?". unable to create your account. "/".GenerateFromPassword([]byte(password). username := req.". password) VALUES(?. 500) return } res.Write([]byte("User created!")) return case err != nil: http. Página 22 de 26 .QueryRow("SELECT username FROM users WHERE username=?".Error(res. req.html") return } username := req. hashedPassword) if err != nil { http. "Server error.Redirect(res.ServeFile(res. ?)". err = db.QueryRow("SELECT username. 301) } } func loginPage(res http.Method != "POST" { http.FormValue("password") var databaseUsername string var databasePassword string err := db.DefaultCost) if err != nil { http.FormValue("password") var user string err := db. "Server error. "login.".Scan(&user) switch { case err == sql. "Server error.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. unable to create your account.ErrNoRows: hashedPassword. req *http. bcrypt. 500) return default: http.Error(res.FormValue("username") password := req. err := bcrypt. unable to create your account. username.Request) { if req.ResponseWriter. 500) return } _.FormValue("username") password := req.Exec("INSERT INTO users(username.".Error(res. username).

req.Write([]byte("Hello" + databaseUsername)) } func homePage(res http.ServeFile(res.Close() err = db. []byte(password)) if err != nil { http.Open("mysql". "index.html") } func main() { db.Scan(&databaseUsername.Error()) } defer db.HandleFunc("/login". "root:Redes2016@/test") if err != nil { panic(err. 301) return } err = bcrypt. req *http. homePage) http.Error()) } http. "/login".Request) { http.Redirect(res. &databasePassword) if err != nil { http.CompareHashAndPassword([]byte(databasePassword).Ping() if err != nil { panic(err.Redirect(res. username).ListenAndServe(":8080". err = sql. signupPage) http.HandleFunc("/signup". req.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. nil) } Página 23 de 26 . req. loginPage) http.ResponseWriter. "/login".HandleFunc("/". 301) return } res.

Posiblemente existan Página 24 de 26 . En el entorno del proyecto. Una vez realizado el procesamiento de datos. porque ante todo busca ser sencillo y seguro en su implementación. Muchas veces el diseño de una adecuada interfaz de usuario marca la diferencia entre una aplicación que sea exitosa y una aplicación que no prospere. La parte principal del proyecto que se presenta. ya sea un movimiento en el servidor. el handler manda los datos de regreso al servidor http en Go para que se encargue de enviar la información requerida o correspondiente al cliente. Una de las mayores ventajas de Go es que posee paquetes y bibliotecas capaces de proporcionar las funcionalidades suficientes para poder levantar un servidor web. para proceder con las tareas que el Handler se encarga de realizar. Su novedad impacta contra su simplicidad. la cual consiste en llamar a la función manejadora correspondiente a la petición. una modificación o petición a la base de datos. puesto que en ello se basa la funcionalidad toda del sistema de administración. aunque no es fundamental el aspecto proporciona gran utilidad ya que el usuario puede llegar a familiarizarse con la plataforma más fácilmente y hacer más eficiente su utilización. database entre otras importantes. el lenguaje Go representa una forma particularmente nueva de abordar esa funcionalidad de manera que sea eficiente. una petición de un documento plano u archivo. Otro de los aspectos que acá se desarrolla y que cuando se presenta un proyecto es necesario pulir. debido a que Go tiene características muy potentes que lo hacen ser un excelente lenguaje de programación. cómo se puede observar en el desarrollo de cómo ha de implementarse la funcionalidad descrita. es la interfaz de usuario planteada. el servicio http de Go mediante las bibliotecas net y http se encargan de recibir y procesar la información de la petición mediante el DefaultServeMux. como el fácil manejo de concurrencia y grandes cantidades de peticiones. El proceso de peticiones de un cliente hacia Go es bastante sencillo de comprender. o lo más comúnmente realizado. Entre las bibliotecas principales podemos encontrar las siguientes: net. Para este proyecto en particular. cuando el servidor recibe una petición por parte del cliente.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. Go es una excelente opción a tomar para su implementación. es indudablemente el flujo de información desde el sitio web a la base de datos y viceversa. Conclusión. El handler a su vez ejecuta todo el código realizado por el desarrollador de acuerdo a la petición. En ese sentido y cómo podemos ver. Esto puede ser mediante archivos html predefinidos o elaborados en tiempo de petición dinamicamente o por el envío de paquetes en formato JSON para ser procesados por el cliente mediante JavaScript. http.

Este documento además de mostrar el diseño web de una plataforma de control escolar.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. pretende mostrar las ventajas de un excelente lenguaje de programación como lo es Go respecto a otros lenguajes. pero sin duda alguna Go brinda eficiencia y seguridad. Página 25 de 26 . frameworks de otros lenguajes de programación que faciliten y disminuyan en cierta medida los tiempos de desarrollo. y como es que se debe de estructurar una aplicación web para su óptimo funcionamiento de manera simple y sencilla.

Estados Unidos.Instituto Tecnológico de Tepic Ingeniería en Sistemas Computacionales Programación Web Aplicación Web Para La Administración De Información Escolar. Donovan. O’Reilly Media Balbaert. Sheong. C. Obtenido de Golang website: https://golang. Varghese. Iuniverse. The Go Programming Language. Addison-Wesley Doxsey. A. Estados Unidos. Go Web Programming. Estados Unidos. S. (2016). (2016). The Go Team. I. (2015) Web Development with Go Building Scalable Web Apps and RESTful Services. Introducing Go. Manning Publications. Referencias Bibliográficas. & Kernighan. Apress. The Go Programming Language. (2012). Estados Unidos. S. (15 de Agosto de 2016). B. Estados Unidos. The Way to Go.org/ Página 26 de 26 . (2016).