Go
Bästa praxis för projektstruktur
Sök…
Restfull Projects API med Gin
Gin är ett webbramverk skrivet i Golang. Den har ett martini-liknande API med mycket bättre prestanda, upp till 40 gånger snabbare. Om du behöver prestanda och god produktivitet kommer du att älska Gin.
Det kommer att finnas 8 paket + main.go
- controllers
- kärna
- libs
- middlewares
- offentlig
- routrar
- tjänster
- tester
- main.go
controllers
Controllers-paket lagrar all API-logik. Oavsett din API kommer din logik att hända härkärna
Core-paketet lagrar alla dina skapade modeller, ORM, etc.libs
Detta paket lagrar alla bibliotek som används i projekt. Men bara för manuellt skapade / importerade bibliotekgo get package_name
som inte är tillgängliga när du använder. Kan vara din egen hashningsalgoritm, graf, träd etc. middlewares
Detta paket lagrar alla mellanprogram som använts i projekt, kan vara skapande / validering av kors, enhets-ID, autorisation osvoffentlig
Denna pacakge lagrar alla offentliga och statiska filer, kan vara html, css, javascript, bilder etc.routrar
Detta paket lagrar alla rutter i ditt REST-API.Se exempelkod för hur du tilldelar rutter.
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) }
Om du ser, är anledningen till att jag separerar hanteraren att vi enkelt kan hantera alla routrar. Så jag kan skapa kommentarer om API, att med apidoc kommer att generera detta till strukturerad dokumentation. Då kommer jag att kalla funktionen i index.go i det aktuella paketet
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) }
tjänster
Detta paket lagrar alla konfigurationer och inställningar som används i projekt från vilken tjänst som helst, kan vara mongodb, redis, mysql, elasticsearch, etc.main.go
API: s huvudingång. Eventuell konfiguration om dev-miljöinställningar, system, port osv kommer att konfigureras här. Exempel:
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: Varje kod i detta exempel kommer från olika projekt
se exempelprojekt på github
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow