Поиск…


Restfull API проектов с Gin

Джин - это веб-фреймворк, написанный в Голанге. Он имеет мартини-подобный API с гораздо лучшей производительностью, в 40 раз быстрее. Если вам нужна производительность и хорошая производительность, вы будете любить Джин.


Будет 8 пакетов + main.go

  1. контроллеры
  2. ядро
  3. ЛИЭС
  4. промежуточное программное
  5. общественности
  6. маршрутизаторы
  7. Сервисы
  8. тесты
  9. main.go

структура проектов


контроллеры

Пакет контроллеров сохранит всю логику API. Независимо от вашего API, ваша логика произойдет здесь

контроллеры


ядро

Основной пакет сохранит все созданные вами модели, ORM и т. Д.

ядро


ЛИЭС

Этот пакет будет хранить любую библиотеку, которая используется в проектах. Но только для созданной вручную / импортированной библиотеки, недоступной при использовании go get package_name команды go get package_name . Может быть ваш собственный алгоритм хэширования, графика, дерева и т. Д.

ЛИЭС


промежуточное программное

Этот пакет хранит каждое промежуточное программное обеспечение, которое используется в проекте, может быть создание / валидация корса, идентификатор устройства, auth и т. Д.

промежуточное программное


общественности

Этот pacakge будет хранить все общедоступные и статические файлы, может быть html, css, javascript, изображения и т. Д.

общественности

маршрутизаторы

Этот пакет будет хранить все маршруты в вашем REST API.

маршрутизаторы

См. Пример кода, как назначить маршруты.

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)
}

Если вы видите, причина, по которой я разделяю обработчик, заключается в том, чтобы легко управлять каждым маршрутизатором. Поэтому я могу создавать комментарии об API, которые с помощью apidoc будут сгенерированы в структурированной документации. Затем я вызову функцию в index.go в текущем пакете

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)
}

Сервисы

Этот пакет будет хранить любую конфигурацию и настройки для использования в проекте из любой используемой службы, может быть mongodb, redis, mysql, elasticsearch и т. Д.

Сервисы


main.go

Главный вход API. Здесь будет сконфигурирована любая настройка параметров среды dev, систем, порта и т. Д.

Пример:
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: Каждый код в этом примере исходит из разных проектов


см. примеры проектов на github



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow