Buscar..


Proyectos Restfull API con Gin

Gin es un framework web escrito en golang. Cuenta con una API similar a la de martini con un rendimiento mucho mejor, hasta 40 veces más rápido. Si necesitas rendimiento y buena productividad, te encantará la ginebra.


Habrá 8 paquetes + main.go

  1. controladores
  2. núcleo
  3. libs
  4. middlewares
  5. público
  6. enrutadores
  7. servicios
  8. pruebas
  9. main.go

estructura de proyectos


controladores

El paquete de controladores almacenará toda la lógica de la API. Cualquiera que sea tu API, tu lógica sucederá aquí

controladores


núcleo

El paquete central almacenará todos sus modelos creados, ORM, etc.

núcleo


libs

Este paquete almacenará cualquier biblioteca que se use en proyectos. Pero solo para la biblioteca creada / importada manualmente, que no está disponible cuando se usan los comandos go get package_name . Podría ser tu propio algoritmo hash, gráfico, árbol, etc.

libs


middlewares

Este paquete almacena cada middleware que se usa en el proyecto, podría ser la creación / validación de cors, device-id, auth, etc.

middlewares


público

Este paquete almacenará todos los archivos públicos y estáticos, pueden ser html, css, javascript, imágenes, etc.

público

enrutadores

Este paquete almacenará todas las rutas en su API REST.

enrutadores

Ver código de ejemplo cómo asignar las rutas.

auth_r.go

import (      
    auth "simple-api/controllers/v1/auth"
    "gopkg.in/gin-gonic/gin.v1"    
)

func SetAuthRoutes(router *gin.RouterGroup) {

/**
 * @api {post} /v1/auth/login Login
 * @apiGroup Users
 * @apiHeader {application/json} Content-Type Accept application/json
 * @apiParam {String} username User username
 * @apiParam {String} password User Password
 * @apiParamExample {json} Input
 *    {
 *      "username": "your username",
 *        "password"     : "your password"        
 *    }
 * @apiSuccess {Object} authenticate Response
 * @apiSuccess {Boolean} authenticate.success Status
 * @apiSuccess {Integer} authenticate.statuscode Status Code
 * @apiSuccess {String} authenticate.message Authenticate Message
 * @apiSuccess {String} authenticate.token Your JSON Token
 * @apiSuccessExample {json} Success
 *    {
 *        "authenticate": {     
 *               "statuscode": 200,
 *              "success": true,
 *           "message": "Login Successfully",
 *              "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"
 *            }
 *      }
 * @apiErrorExample {json} List error
 *    HTTP/1.1 500 Internal Server Error
 */

    router.POST("/auth/login" , auth.Login)
}

Si ve, la razón por la que separo el controlador es para que podamos administrar cada uno de los enrutadores. Entonces puedo crear comentarios sobre la API, que con apidoc generará esto en documentación estructurada. Luego llamaré a la función en index.go en el paquete actual

index.go

package v1


import (
    "gopkg.in/gin-gonic/gin.v1"
    token "simple-api/middlewares/token"
    appid "simple-api/middlewares/appid"
)
func InitRoutes(g *gin.RouterGroup)  {
    g.Use(appid.AppIDMiddleWare())
    SetHelloRoutes(g)
    SetAuthRoutes(g) // SetAuthRoutes invoked 
    g.Use(token.TokenAuthMiddleWare())  //secure the API From this line to bottom with JSON Auth
    g.Use(appid.ValidateAppIDMiddleWare())
    SetTaskRoutes(g)
    SetUserRoutes(g)
}

servicios

Este paquete almacenará cualquier configuración y configuración para usar en el proyecto de cualquier servicio usado, podría ser mongodb, redis, mysql, elasticsearch, etc.

servicios


main.go

La entrada principal de la API. Aquí se configurará cualquier configuración acerca de la configuración del entorno de desarrollo, sistemas, puertos, etc.

Ejemplo:
main.go

package main
import (
    "fmt"
    "net/http"
    "gopkg.in/gin-gonic/gin.v1"
    "articles/services/mysql"
    "articles/routers/v1"
    "articles/core/models"
)

var router  *gin.Engine;

func init() {
    mysql.CheckDB()
    router = gin.New();
    router.NoRoute(noRouteHandler())
    version1:=router.Group("/v1")
    v1.InitRoutes(version1)

}

func main() {
    fmt.Println("Server Running on Port: ", 9090)
    http.ListenAndServe(":9090",router)
}   

func noRouteHandler() gin.HandlerFunc{
    return  func(c *gin.Context) {
    var statuscode     int
    var message        string         = "Not Found"
    var data         interface{} = nil
    var listError [] models.ErrorModel = nil
    var endpoint    string = c.Request.URL.String()
    var method        string = c.Request.Method

    var tempEr models.ErrorModel
    tempEr.ErrorCode     = 4041    
    tempEr.Hints         = "Not Found !! \n Routes In Valid. You enter on invalid Page/Endpoint"
    tempEr.Info            = "visit http://localhost:9090/v1/docs to see the available routes"
    listError             = append(listError,tempEr)
    statuscode             = 404
    responseModel := &models.ResponseModel{
        statuscode,
        message,
        data,
        listError,
        endpoint,
        method,
    } 
    var content gin.H = responseModel.NewResponse();   
    c.JSON(statuscode,content)
    }
}

ps: Cada código en este ejemplo, provienen de diferentes proyectos


ver proyectos de muestra en github



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow