수색…


GIN을 사용한 Restfull 프로젝트 API

Gin은 Golang으로 작성된 웹 프레임 워크입니다. 그것은 더 나은 성능, 최대 40 배 빠른 마티니와 같은 API를 특징으로합니다. 성능과 우수한 생산성이 필요한 경우 Gin을 좋아할 것입니다.


8 패키지 + main.go있을 것입니다

  1. 컨트롤러
  2. 핵심
  3. libs
  4. 미들웨어
  5. 공공의
  6. 라우터
  7. 서비스
  8. 검사들
  9. main.go

프로젝트 구조


컨트롤러

컨트롤러 패키지는 모든 API 로직을 저장합니다. API가 무엇이든간에 여기에서 논리가 발생합니다.

컨트롤러


핵심

코어 패키지는 생성 된 모든 모델, ORM 등을 저장합니다.

핵심


libs

이 패키지는 프로젝트에서 사용 된 모든 라이브러리를 저장합니다. 그러나 수동으로 생성 / 가져온 라이브러리의 경우에만 사용할 수 있으며 go get package_name 명령을 사용할 때는 사용할 수 없습니다. 자신의 해싱 알고리즘, 그래프, 트리 등이 될 수 있습니다.

libs


미들웨어

이 패키지는 프로젝트에 사용 된 모든 미들웨어를 저장하고, cors, device-id, auth 등의 생성 / 검증이 가능합니다.

미들웨어


공공의

이 pacakge는 모든 공개 및 정적 파일을 저장하고 HTML, CSS, 자바 스크립트, 이미지 등이 될 수 있습니다.

공공의

라우터

이 패키지는 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