API RESTful en Go

A continuación podemos ver una simple Api RESTful en Go.

Esto es una continuación del post: API RESTful

A nivel de archivos encontramos los siguientes

  • main.go -> este posee la definición de las rutas y la inicilización del servidor
  • endpoitns/personas.go -> en este se encuentran cada uno de las operaciones sobre personas, asi como un mapeo de datos de ejemplos

Archivo: main.go

En la función main se tienen 3 bloques bien definidos en la funcion main(), con la cual inicia la aplicación

  1. Creamos el elemento router que será el encargado de recibir las peticiones y redireccionar a la función que corresponda. Para esto usamos el paquete Gorilla/mux
  2. Agregamos a cada router el hander a utilizar en el cual se indica
    1. La ruta por ejemplo /persona
    2. La función a ejecutar cuando solicitemos esa ruta
    3. El método que aceptamos para esa ruta
  3. Finalmente inicializamos el servidor

A continuación veremos unos ejemplos de Rutas

En esta primera definimos a que función se debe invocar cuando queremos hacer un GET a la ruta /personas

router.HandleFunc("/personas", endpoint.GetPersonas).Methods("GET")

Esta es igual a la anterior, solo que le indicamos que lo que llega luego de /persona debe llamarse ID y debe esta compuesto por números

router.HandleFunc("/personas/{ID:[0-9]+}", endpoint.GetPersonaById).Methods("GET")
Archivo: endpoints/personas.go

En este archivo tenemos las funciones definidas para cada una de las rutas

1.- Listar todos los datos

func GetPersonas(w http.ResponseWriter, r *http.Request) {
  //Codifico el map en json
  salidaJson, _ := json.Marshal(Sample)
  //Inidico que los datos devueltos van en json
  w.Header().Set("Content-Type", "application/json")
  w.Write(salidaJson)
}

Cada función definida como handler debe tener los parámetros

  • http.ResponseWriter: Este es utilizado para responder al cliente que consume el endpoint
  • http.Request: Por medio de este obtenernos los datos enviados

1.- Retornar los datos solicitados

func GetPersonaById(w http.ResponseWriter, r *http.Request) {
  //Obtengo las variables definidas en la ruta
  vars := mux.Vars(r)
  //Verifico si existe y retorno el valor en json o doy un error NotFound
  if _, ok := Sample[vars["ID"]]; ok {
    //Codifico el registro en json
    salidaJson, _ := json.Marshal(Sample[vars["ID"]])
    //Inidico que los datos devueltos van en json
    w.Header().Set("Content-Type", "application/json")
    w.Write(salidaJson)
  } else {
    http.Error(w, "StatusNotFound", http.StatusNotFound)
  }
}

Con la linea de código mux.Vars(r) obtenemos todos los parámetros definidos en la ruta por lo cual podemos obtener el id indicado en /personas/3

En el siguiente repositorio de GitHub se tienen la APIRest completa <link>, el resto del código es fácil de interpretar por eso no lo escribo todo acá, puesto que es para que sea como una referencia mínima al como codificar la API