- 安装:
go get github.com/gin-gonic/gin
- 示例程序
package main
import (
"fmt"
"net/http"
"path"
"github.com/gin-gonic/gin"
)
type Account struct {
Username string `json:"username"`
Password string `json:"password"`
Avatar string `json:"avatar"`
}
type Response struct {
Code ResponseCode `json:"code"`
Err string `json:"err"`
Data interface{} `json:"data"`
}
type ResponseCode int32
const (
ACCOUNT_NOT_EXISTS ResponseCode = 10001
ACCOUNT_LOGIN_FAILED ResponseCode = 10002
USERNAME_ILEGAL ResponseCode = 10003
MULTIPART_FILE_ERROR ResponseCode = 10004
UNKNOWN_URL ResponseCode = 10005
)
func (code ResponseCode) String() string {
switch code {
case ACCOUNT_NOT_EXISTS:
return "用户不存在"
case ACCOUNT_LOGIN_FAILED:
return "用户登录失败"
case USERNAME_ILEGAL:
return "非法的用户名"
case MULTIPART_FILE_ERROR:
return "文件上传错误"
case UNKNOWN_URL:
return "未知路径"
default:
return "未知响应码"
}
}
func Ok(data interface{}) *Response {
return &Response{http.StatusOK, "", data}
}
func Error(code ResponseCode, err string) *Response {
return &Response{code, err, nil}
}
func main() {
router := gin.Default()
db := Account{"Acc01", "123456", "avatarurl.png"}
router.GET("/accounts", func(c *gin.Context) {
resp := Ok(db)
c.JSON(http.StatusOK, resp)
})
router.GET("/accounts/query", func(c *gin.Context) {
username := c.Query("username")
password := c.Query("password")
avatar := c.DefaultQuery("avatar", "avatarurl")
account := &Account{username, password, avatar}
resp := Ok(account)
c.JSON(http.StatusOK, resp)
})
router.POST("/accounts/login", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
if CheckAccount(username, password) {
c.JSON(http.StatusOK, Ok(nil))
} else {
c.JSON(http.StatusOK, Error(ACCOUNT_LOGIN_FAILED, ACCOUNT_LOGIN_FAILED.String()))
}
})
router.GET("/:username/:password", func(c *gin.Context) {
username := c.Param("username")
password := c.Param("password")
fmt.Println(username, password)
c.JSON(http.StatusOK, Ok(nil))
})
router.PUT("/accounts", func(c *gin.Context) {
var account Account
c.ShouldBind(&account)
fmt.Println(account)
c.JSON(http.StatusOK, Ok(nil))
})
router.MaxMultipartMemory = 8 << 20
router.POST("/upload", func(c *gin.Context) {
file, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusOK, Error(MULTIPART_FILE_ERROR, MULTIPART_FILE_ERROR.String()))
return
}
filename := file.Filename
fileSavePath := path.Join("./", "images", filename)
c.SaveUploadedFile(file, fileSavePath)
c.JSON(http.StatusOK, Ok(nil))
})
router.GET("/http/redirect", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
})
router.GET("/router/redirect", func(c *gin.Context) {
c.Request.URL.Path = "/accounts"
router.HandleContext(c)
})
router.NoRoute(func(c *gin.Context) {
c.JSON(http.StatusOK, Error(UNKNOWN_URL, UNKNOWN_URL.String()))
})
accountGroup := router.Group("/accounts")
accountGroup.POST("/register", func(c *gin.Context) {})
accountGroup.DELETE("/:id", func(c *gin.Context) {})
router.GET("/accounts/infos", LoginInterceptor, func(c *gin.Context) {
fmt.Println("Get Accounts Infos...")
})
router.Use(LoginInterceptor)
router.Run(":9090")
}
func LoginInterceptor(c *gin.Context) {
fmt.Println("登录拦截...")
c.Next()
}
func CheckAccount(u string, p string) bool {
return true
}