02. Go web: ¿cómo hacer peticiones HTTP con Golang?

Publicado por

Es hora de comenzar a usar los paquetes web que vienen incluidos con Golang. En esta entrada crearemos un pequeño servidor que atenderá peticiones HTTP. Sin más que agregar, comencemos.

Creando un servidor

Lo primero que haremos es crear un archivo con el nombre ‘codingornot.go’ (nombre opcional), que será nuestro servidor en cuestión. En seguida, importamos los paquetes necesarios para nuestro programa, como esta será una versión de prueba con la única finalidad de familiarizarnos un poco con las peticiones y respuestas HTTP, solamente necesitaremos el paquete de salidas con formato (fmt) y un paquete para las peticiones HTTP (net/http):

import (
  "fmt"
  "net/http"
)

En seguida creamos una función que será la encargada de manejar las peticiones. En este caso la llamaré manejador() pero tú puedes usar el nombre que creas conveniente:

func manejador(w http.ResponseWriter, r *http.Request){
  fmt.Fprintf(w,"Hola, %s, ¡este es un servidor!", r.URL.Path)
}

Esta función recibe como primer argumento un dato tipo http.ResponseWriter que forma parte del paquete net/http. Este se encarga de construir la respuesta del servidor, es decir, es el que envía los mensajes al cliente HTTP.

El segundo argumento de manejador() es un tipo http.Request, es decir, son las peticiones del cliente HTTP.

Dentro del cuerpo de la función escribimos un mensaje a w (la respuesta para el cliente) por medio de fmt.Fprintf(). En este caso escribimos un saludo junto con la ruta de la solicitud, la cual puede ser consultada con r.URL.Path. La ruta en este caso será:“/codingornot”, si quisieras que solamente apareciera el nombre, puedes crear un slice con el nombre de la ruta a partir del segundo caracter (r.URL.Path[1:] devolvería “codingornot” en lugar de “/codingornot”).

Ahora creamos la función principal (main()) desde la cual haremos el llamado a manejador():

func main(){
  http.HandleFunc("/", manejador)
  http.ListenAndServe(":8080", nil)
}

Primero hacemos llamado a http.HandleFunc() para que el paquete http se encargue de las peticiones hechas a la web raíz (“/”) por medio de nuestra, previamente construida, función manejador().

En seguida, llamamos a la función http.ListenAndServe() para que el programa se mantenga bloqueado escuchando peticiones en el puerto 8080 (“:8080”) hasta que termine su ejecución. El uso del parámetro nil será explicado en entradas posteriores, por el momento dejemos esa parte así.

Programa funcional

El siguiente programa reúne todo lo visto en esta entrada:

package main
import (
  "fmt"
  "net/http"
)

func manejador(w http.ResponseWriter, r *http.Request){
  fmt.Fprintf(w,"Hola, %s, ¡este es el servidor!", r.URL.Path)
}

func main(){
  http.HandleFunc("/", manejador)
  fmt.Println("El servidor se encuentra en ejecución")
  http.ListenAndServe(":8080", nil)
}

Compilamos y ejecutamos el programa:

go build codingornot.go
./codingornot

Para verificar que funciona correctamente, accedemos a la siguiente URL:

http://localhost:8080/codingornot

Se abrirá una página con el siguiente mensaje:

Hola, /codingornot, ¡este es el servidor!

Finalizando…

En la siguiente entrada aprenderemos a servir las páginas wiki que creamos en la entrada anterior usando el paquete net/http. Espero que esta entrada te haya servido, si tienes alguna duda puedes escribirla en los comentarios y te responderé a la brevedad. Hasta la próxima. See ya!

8 comments

  1. estoy usando windows. quisiera saber si cambia en algo el manejo de los puertos y los números de errores en la configuración de estos programas. gracias

    1. Hola, Aquiles. Gracias por leernos. Cambian solamente si tu cambias los puertos manualmente, si utilizas los por defecto, no debe de haber inconveniente alguno. En general, Golang no cambia implementaciones entre plataformas. Saludos.

  2. Buenos días Uriel, gusto en saludarte.
    Una consulta, en la implementación «puesta en producción» de una aplicación web desarrollada con Golang, si requiero hacerlo utilizando un servidor de páginas, por ejemplo apache, es posible?
    Saludos cordiales

    1. Hola, Gustavo, gracias por leernos. Lo que puedes hacer es usar un servidor HTTP tipo Apache como servidor proxy HTTP. Pero esto no es necesario, Go es capaz de funcionar como servidor web por sí mismo.

  3. Hola, me gustaría saber si existe una forma de hacer un login automático, se estan consumiendo servicios de una página pero no sé va exponer el login al usuario, este se va manejar dentro del servicio go, existe alguna forma de enviar solicitudes desde el mismo código go?

    1. Hola, no estoy seguro a lo que te refieres con login automático, pero sí puedes hacer una página de login con Go manejando los datos que un ‘form’ regresa. Existen algunos snippets en línea que algunos programadores han compartido con la comunidad que puedes usar para orientarte si no estás seguro cómo iniciarlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *