Commit 150a2cb2 authored by emilio.sarda's avatar emilio.sarda

inicio del proyecto

parents
Pipeline #357 canceled with stages
apiPrueba.exe
apiPrueba
.vscode
## Api de prueba con Go ##
Aplicacion de apoyo para consumir una API de prueba.
Los datos se deben insertar en la capeta **server** en formato ***json***
```json
[
{"ipCamara": "192.168.0.1", "ipMCU": "10.10.10.1", "pxs": 25, "ab": 4.20},
{"ipCamara": "192.168.0.2", "ipMCU": "10.10.10.1", "pxs": 40, "ab": 3.73}
]
```
Debe crear una estructura para mapear los datos del json:
```go
//Estadistica ...
type Estadistica struct {
Camara string `json:"ipCamara"`
MCU string `json:"ipMCU"`
PxS int `json:"pxs"`
AB float64 `json:"ab"`
}
```
### Se deben registrar las rutas pasando el middleware ***cors*** y la funcion controladora
que atendera la ruta pasada como parametro cono **string**
Las funciones controladoras deben cumplir con la firma:
**(http.ResponseWriter, *http.Request)***
```go
r.HandleFunc("/estadisticas", cors(leerEstadisticas))
r.HandleFunc("/chequeo", cors(chequearCamara))
func chequearCamara(w http.ResponseWriter, r *http.Request)
func leerEstadisticas(w http.ResponseWriter, _ *http.Request)
```
### Se insertan las cabeceras necesarias para poder consumir los datos desde dominios diferentes.
(CORS)
```go
func cors(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if origin := r.Header.Get("Origin"); origin != "" {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
//w.Header().Set("Access-Control-Expose-Headers", "Authorization")
}
if r.Method == "OPTIONS" {
return
}
h.ServeHTTP(w, r)
}
}
```
En este ejemplo quedan expuestas en todas las direcciones IP de la computadora que ejecuta el programa:
1. http://<ip>:8080/estadisticas
2. http://<ip>:8080/chequeo?ip=192.168.0.1
module emilio/trabajo/api-go-prueba
go 1.16
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"strings"
)
//Estadistica ...
type Estadistica struct {
Camara string `json:"ipCamara"`
MCU string `json:"ipMCU"`
PxS int `json:"pxs"`
AB float64 `json:"ab"`
}
func getEstadisticas() ([]Estadistica, error) {
var estadisticas []Estadistica
file, err := os.Open("./server/estadisticas.json")
if err != nil {
log.Println(err)
return estadisticas, err
}
defer func(f *os.File) { _ = f.Close() }(file)
decoder := json.NewDecoder(file)
err = decoder.Decode(&estadisticas)
if err != nil {
log.Println(err)
return estadisticas, err
}
return estadisticas, nil
}
func main() {
serveStatic()
}
func serveStatic() {
r := http.NewServeMux()
//fs := http.FileServer(http.Dir("./www"))
//r.Handle("/", http.StripPrefix("/", fs))
r.HandleFunc("/estadisticas", cors(leerEstadisticas))
r.HandleFunc("/chequeo", cors(chequearCamara))
log.Println("Iniciando el servidor en el puerto 8080 ...")
log.Fatal(http.ListenAndServe("0.0.0.0:8080", r))
}
func leerEstadisticas(w http.ResponseWriter, _ *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
estadisticas, err := getEstadisticas()
if err != nil {
_ = json.NewEncoder(w).Encode(nil)
}
_ = json.NewEncoder(w).Encode(estadisticas)
}
func chequearCamara(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
if r.Method != "GET" {
_ = json.NewEncoder(w).Encode("metodo incorrecto")
}
estado := 1
ipCamara := r.FormValue("ip")
fmt.Println(ipCamara)
estadisticas, err := getEstadisticas()
for _, estadistica := range estadisticas {
fmt.Println(estadistica)
if strings.Contains(ipCamara, estadistica.Camara) && estadistica.PxS < 20 && estadistica.PxS > 10 {
estado = 2
_ = json.NewEncoder(w).Encode(estado)
return
}
if strings.Contains(ipCamara, estadistica.Camara) && estadistica.PxS < 10 {
estado = 3
_ = json.NewEncoder(w).Encode(estado)
return
}
if strings.Contains(ipCamara, estadistica.Camara) && estadistica.PxS > 20 {
estado = 0
_ = json.NewEncoder(w).Encode(estado)
return
}
if strings.Contains(ipCamara, estadistica.Camara) && estadistica.PxS == 40 {
estado = 4
_ = json.NewEncoder(w).Encode(estado)
return
}
}
if err != nil {
fmt.Println(err)
estado = 5
_ = json.NewEncoder(w).Encode(estado)
return
}
if estado == 1 {
estado = 5
}
_ = json.NewEncoder(w).Encode(estado)
}
func cors(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if origin := r.Header.Get("Origin"); origin != "" {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
//w.Header().Set("Access-Control-Expose-Headers", "Authorization")
}
if r.Method == "OPTIONS" {
return
}
h.ServeHTTP(w, r)
}
}
[
{"ipCamara": "192.168.0.1", "ipMCU": "10.10.10.1", "pxs": 25, "ab": 4.20},
{"ipCamara": "192.168.0.2", "ipMCU": "10.10.10.1", "pxs": 40, "ab": 3.73},
{"ipCamara": "192.168.0.3", "ipMCU": "10.10.10.1", "pxs": 70, "ab": 2.80},
{"ipCamara": "192.168.0.4", "ipMCU": "10.10.10.1", "pxs": 60, "ab": 2.65},
{"ipCamara": "192.168.0.5", "ipMCU": "10.10.10.1", "pxs": 60, "ab": 4.00},
{"ipCamara": "192.168.0.6", "ipMCU": "11.10.10.2", "pxs": 26, "ab": 0.75},
{"ipCamara": "192.168.0.7", "ipMCU": "11.10.10.3", "pxs": 36, "ab": 1.30},
{"ipCamara": "192.168.0.8", "ipMCU": "11.10.10.3", "pxs": 41, "ab": 4.20}
]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment