Go
Najlepsze praktyki dotyczące struktury projektu
Szukaj…
Restfull Projects API with Gin
Gin to framework internetowy napisany w Golang. Posiada podobny do martini interfejs API o znacznie lepszej wydajności, nawet 40 razy szybszy. Jeśli potrzebujesz wydajności i dobrej wydajności, pokochasz Gin.
Będzie 8 paczek + main.go
- kontrolery
- rdzeń
- libs
- middleware
- publiczny
- routery
- usługi
- testy
- main.go
kontrolery
Pakiet kontrolerów będzie przechowywał całą logikę API. Bez względu na interfejs API, logika się tutaj stanierdzeń
Pakiet podstawowy przechowuje wszystkie utworzone modele, ORM itplibs
Ten pakiet będzie przechowywać dowolną bibliotekę używaną w projektach. Ale tylko dla ręcznie utworzonej / importowanej biblioteki, która nie jest dostępna podczas używania komendgo get package_name
. Może to być Twój własny algorytm haszujący, wykres, drzewo itp. middleware
Ten pakiet przechowuje każde oprogramowanie pośrednie użyte w projekcie, może to być tworzenie / sprawdzanie poprawności cors, ID urządzenia, autoryzacja itppubliczny
Ten pacakge będzie przechowywać wszystkie pliki publiczne i statyczne, mogą to być html, css, javascript, obrazy itproutery
W tym pakiecie będą przechowywane wszystkie trasy w interfejsie API REST.Zobacz przykładowy kod, jak przypisać trasy.
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) }
Jeśli widzisz, powodem oddzielenia modułu obsługi jest ułatwienie nam zarządzania każdym routerem. Mogę więc tworzyć komentarze na temat API, które dzięki apidoc wygenerują to w ustrukturyzowanej dokumentacji. Następnie wywołam funkcję w index.go w bieżącym pakiecie
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) }
usługi
Ten pakiet będzie przechowywać dowolną konfigurację i ustawienia używane w projekcie z dowolnej używanej usługi, może to być mongodb, redis, mysql, elasticsearch itp.main.go
Główne wejście API. Tutaj zostanie skonfigurowana dowolna konfiguracja ustawień środowiska programistycznego, systemów, portu itp. Przykład:
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: Każdy kod w tym przykładzie pochodzi z różnych projektów
zobacz przykładowe projekty na github
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow