"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Rest Full API - Golang (mejores prácticas)

Rest Full API - Golang (mejores prácticas)

Publicado el 2024-08-19
Navegar:677

Rest Full API - Golang (Best Practices)

1. Estructura del proyecto

Organiza tu código de manera que sea fácil de entender y ampliar. Una estructura común incluye separar el código en carpetas como modelos, controladores, rutas, middlewares, utilidades y configuración.

Ejemplo de estructura:

go-rest-api/
|-- main.go
|-- config/
|   |-- config.go
|-- handlers/
|   |-- user.go
|-- models/
|   |-- user.go
|-- routes/
|   |-- routes.go
|-- middlewares/
|   |-- logging.go
|-- utils/
|   |-- helpers.go

2. Configuración del entorno

Almacenar ajustes de configuración (como credenciales de base de datos, números de puerto, etc.) en variables de entorno o archivos de configuración. Utilice un paquete como viper para administrar las configuraciones.

config/config.go:

package config

import (
    "github.com/spf13/viper"
    "log"
)

type Config struct {
    Port string
    DB   struct {
        Host     string
        Port     string
        User     string
        Password string
        Name     string
    }
}

var AppConfig Config

func LoadConfig() {
    viper.SetConfigName("config")
    viper.AddConfigPath(".")
    viper.AutomaticEnv()

    if err := viper.ReadInConfig(); err != nil {
        log.Fatalf("Error reading config file, %s", err)
    }

    err := viper.Unmarshal(&AppConfig)
    if err != nil {
        log.Fatalf("Unable to decode into struct, %v", err)
    }
}

3. Manejo de errores

Maneje siempre los errores de manera adecuada. Devuelve mensajes de error significativos y códigos de estado HTTP.

handlers/user.go:

func GetUserHandler(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    id, err := strconv.Atoi(params["id"])
    if err != nil {
        http.Error(w, "Invalid user ID", http.StatusBadRequest)
        return
    }

    user, err := findUserByID(id)
    if err != nil {
        http.Error(w, "User not found", http.StatusNotFound)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}

4. Software intermedio

Utilice middlewares para registro, autenticación y otras cuestiones transversales.

middlewares/logging.go:

package middlewares

import (
    "log"
    "net/http"
    "time"
)

func LoggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        log.Printf("%s %s %s", r.Method, r.RequestURI, time.Since(start))
    })
}

En main.go o rutas/routes.go:

r.Use(middlewares.LoggingMiddleware)

5. Manejo de JSON

Utilice codificación y decodificación JSON adecuada. Valide los datos JSON entrantes para asegurarse de que cumplan con la estructura esperada.

handlers/user.go:

func CreateUserHandler(w http.ResponseWriter, r *http.Request) {
    var user models.User
    if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
        http.Error(w, "Invalid input", http.StatusBadRequest)
        return
    }

    // Validate user data...

    users = append(users, user)

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}

6. Acceso a la base de datos

Utiliza una base de datos para almacenar tus datos. Utilice un paquete como gorm para ORM o sqlx para consultas SQL sin formato.

modelos/usuario.go:

package models

import "gorm.io/gorm"

type User struct {
    gorm.Model
    Name  string `json:"name"`
    Email string `json:"email"`
}

principal.go:

package main

import (
    "github.com/yourusername/go-rest-api/config"
    "github.com/yourusername/go-rest-api/routes"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "log"
    "net/http"
)

func main() {
    config.LoadConfig()

    dsn := "host="   config.AppConfig.DB.Host  
        " user="   config.AppConfig.DB.User  
        " password="   config.AppConfig.DB.Password  
        " dbname="   config.AppConfig.DB.Name  
        " port="   config.AppConfig.DB.Port  
        " sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("Could not connect to the database: %v", err)
    }

    r := routes.NewRouter(db)

    log.Println("Starting server on port", config.AppConfig.Port)
    log.Fatal(http.ListenAndServe(":" config.AppConfig.Port, r))
}

7. Registro

Utilice una biblioteca de registro estructurada como logrus o zap para un mejor registro.

middlewares/logging.go:

package middlewares

import (
    "github.com/sirupsen/logrus"
    "net/http"
    "time"
)

func LoggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        logrus.WithFields(logrus.Fields{
            "method": r.Method,
            "url":    r.URL.Path,
            "time":   time.Since(start),
        }).Info("handled request")
    })
}

8. Seguridad

Asegúrese de que su API sea segura mediante el uso de HTTPS, validando y desinfectando entradas e implementando autenticación y autorización adecuadas.

9. Versionado

Versione su API para manejar los cambios sin afectar a los clientes existentes. Esto se puede hacer incluyendo la versión en la URL, como /api/v1/users.

10. Documentación

Documente su API utilizando herramientas como Swagger o Postman para proporcionar instrucciones de uso claras para los desarrolladores.

Al seguir estas mejores prácticas, puedes crear una API RESTful sólida, mantenible y escalable en Go.

Declaración de liberación Este artículo se reproduce en: https://dev.to/faiyajz/rest-full-api-golang-best-practices-g0n?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3