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
- 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
- Agregamos a cada router el hander a utilizar en el cual se indica
- La ruta por ejemplo /persona
- La función a ejecutar cuando solicitemos esa ruta
- El método que aceptamos para esa ruta
- 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
Pingback: API RESTful – Otro Del Montón