Go
Best Practices zur Projektstruktur
Suche…
Restfull Projects API mit Gin
Gin ist ein in Golang geschriebenes Web-Framework. Es verfügt über eine martiniähnliche API, die bis zu 40-mal schneller ist. Wenn Sie Leistung und gute Produktivität benötigen, werden Sie Gin lieben.
Es wird 8 Pakete + main.go geben
- Steuerungen
- Ader
- Libs
- Middlewares
- Öffentlichkeit
- Router
- Dienstleistungen
- Tests
- main.go
Steuerungen
Das Controller-Paket speichert die gesamte API-Logik. Was auch immer Ihre API ist, Ihre Logik wird hier geschehenAder
Im Kernpaket werden alle erstellten Modelle, ORM usw. gespeichertLibs
In diesem Paket wird jede Bibliothek gespeichert, die in Projekten verwendet wird. Aber nur für manuell erstellte / importierte Bibliotheken, die nicht verfügbar sind, wenn die Befehlego get package_name
werden. Könnte Ihr eigener Hash-Algorithmus, Graph, Baum usw. sein Middlewares
Dieses Paket speichert jede Middleware, die in einem Projekt verwendet wird. Dies kann die Erstellung / Validierung von Kors, die Geräte-ID, die Authentifizierung usw.Öffentlichkeit
In diesem Paket werden alle öffentlichen und statischen Dateien gespeichert. Dies können HTML, CSS, Javascript, Bilder usw. seinRouter
Dieses Paket speichert alle Routen in Ihrer REST-API.Siehe Beispielcode zum Zuweisen der Routen.
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) }
Wenn Sie sehen, ist der Grund, warum ich den Handler trenne, einfach, die einzelnen Router zu verwalten. So kann ich Kommentare zur API erstellen, die mit apidoc in strukturierter Dokumentation generiert werden. Dann werde ich die Funktion in index.go im aktuellen Paket aufrufen
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) }
Dienstleistungen
In diesem Paket werden alle in einem Projekt verwendeten Konfigurationen und Einstellungen gespeichert, z. B. Mongodb, Redis, MySQL, Elasticsearch usw.main.go
Der Haupteingang der API. Alle Einstellungen zu den Einstellungen der Dev-Umgebung, zu Systemen, zum Port usw. werden hier konfiguriert. Beispiel:
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: Jeder Code in diesem Beispiel stammt aus verschiedenen Projekten
Siehe Beispielprojekte auf Github
Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow