天天看點

gin入門-1

Gin架構介紹

1. 簡介Gin架構介紹

A. 基于httprouter開發的web架構。http://github.com/julienschmidt/httprouter

B. 提供Martini風格的API,但比Martini要快40倍

C. 非常輕量級,使用起來非常簡潔

Gin架構介紹

2. Gin架構安裝與使用

Gin架構介紹

A. 安裝: go get -u github.com/gin-gonic/gin

B. import “go get -u github.com/gin-gonic/gin”

package main
import "github.com/gin-gonic/gin"
func main() {
//Default傳回一個預設的路由引擎
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}      

3. Gin架構安裝與使用 Gin架構介紹

  A. 支援restful風格的API

package main
import "github.com/gin-gonic/gin"
func main() {
//Default傳回一個預設的路由引擎
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.POST("/ping", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}      

4. Restful風格的API

Gin架構介紹

A. 把我們設計的API抽象成一個個資源,用URI來辨別。

B. 針對每一個資源,使用統一的方法進行操作。

C. 同一的方法有:

a. GET,擷取資源内容。

b. POST,建立資源。

c. PUT,更新資源。

d. DELETE,删除資源。

5. 舉例:使用者資訊接口設計,資源就是 /user/info

package main
import "github.com/gin-gonic/gin"
func main() {
//Default傳回一個預設的路由引擎
r := gin.Default()
r.GET("/user/info", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.POST("/user/info", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.PUT("/user/info", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.DELETE("/user/info", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}      

6. 舉例:使用者資訊接口設計,非restful風格的API

package main
import "github.com/gin-gonic/gin"
func main() {
//Default傳回一個預設的路由引擎
r := gin.Default()
r.GET("/user/info", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.POST("/user/create", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.POST("/user/delete", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.POST("/user/update", func(c *gin.Context) {
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}      

Gin架構參數傳遞

1. 通過querystring傳遞, 比如: /user/search?username=少林&address=北京

package main
import "github.com/gin-gonic/gin"
func main() {
//Default傳回一個預設的路由引擎
r := gin.Default()
r.GET("/user/search", func(c *gin.Context) {
//username := c.DefaultQuery("username", "少林")
username = c.Query("username")
address := c.Query("address")
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
"username": username,
"address": address,
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}      

2. 通過路徑傳遞, 比如: /user/search/少林/北京

package main
import "github.com/gin-gonic/gin"
func main() {
//Default傳回一個預設的路由引擎
r := gin.Default()
r.GET("/user/info", func(c *gin.Context) {
//username := c.DefaultQuery("username", "少林")
username = c.Query("username")
address := c.Query("address")
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
"username": username,
"address": address,
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}      

3. 通過表單進行送出, 比如: POST /user/search/

  A. 下載下傳postman測試工具,測試api非常友善,下載下傳位址: https://www.getpostman.com/apps

package main
import "github.com/gin-gonic/gin"
func main() {
//Default傳回一個預設的路由引擎
r := gin.Default()
r.GET("/user/info", func(c *gin.Context) {
//username := c.DefaultQuery("username", "少林")
username = c.Query("username")
address := c.Query("address")
//輸出json結果給調用方
c.JSON(200, gin.H{
"message": "pong",
"username": username,
"address": address,
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}      

Gin架構處理檔案上傳

1. 單個檔案上傳

package main
import (
"fmt"
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// Set a lower memory limit for multipart forms (default is 32 MiB)
// router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// single file
file, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
})
return
}
log.Println(file.Filename)
dst := fmt.Sprintf("C:/tmp/%s", file.Filename)
// Upload the file to specific dst.
c.SaveUploadedFile(file, dst)
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("'%s' uploaded!", file.Filename),
})
})
router.Run(":8080")
}      

Gin架構處理檔案上傳

2. 多個檔案上傳

package main
import (
"fmt"
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// Set a lower memory limit for multipart forms (default is 32 MiB)
// router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// Multipart form
form, _ := c.MultipartForm()
files := form.File["file"]
for index, file := range files {
log.Println(file.Filename)
dst := fmt.Sprintf("C:/tmp/%s_%d", file.Filename, index)
c.SaveUploadedFile(file, dst)
}
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("%d files uploaded!", len(files)),
})
})
router.Run(":8080")
}      

Gin架構路由分組

1. 路由分組功能介紹

package main
import "github.com/gin-gonic/gin"
func login(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"message": "success",
})
}
func submit(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"message": "success",
})
}
func main() {
//Default傳回一個預設的路由引擎
router := gin.Default()
// Simple group: v1
v1 := router.Group("/v1")
{
v1.POST("/login", login)
v1.POST("/submit", submit)
}
// Simple group: v2
v2 := router.Group("/v2")
{
v2.POST("/login", login)
v2.POST("/submit", submit)
}
router.Run(":8080")
}      

Gin架構參數綁定

1. 為什麼要參數綁定,本質上是友善,提高開發效率

Gin架構參數綁定

A. 通過反射的機制,自動提取querystring、form表單、json、xml等參數到struct中

B. 通過http協定中的context type,識别是json、xml或者表單

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// Binding from JSON
type Login struct {
User string `form:"user" json:"user" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
}
func main() {
router := gin.Default()
// Example for binding JSON ({"user": "manu", "password": "123"})
router.POST("/loginJSON", func(c *gin.Context) {
var login Login
if err := c.ShouldBindJSON(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"user": login.User,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// Example for binding a HTML form (user=manu&password=123)
router.POST("/loginForm", func(c *gin.Context) {
var login Login
// This will infer what binder to use depending on the content-type header.
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"user": login.User,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// Example for binding a HTML querystring (user=manu&password=123)
router.GET("/loginForm", func(c *gin.Context) {
var login Login
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"user": login.User,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
router.Run(":8080")
}      

Gin架構渲染

1. 渲染json Gin架構渲染

A. gin.Context.JSON方法進行渲染

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// gin.H is a shortcut for map[string]interface{}
r.GET("/someJSON", func(c *gin.Context) {
//第一種方式,自己拼json
c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
})
r.GET("/moreJSON", func(c *gin.Context) {
// You also can use a struct
var msg struct {
Name string `json:"user"`
Message string
Number int
}
msg.Name = "Lena"
msg.Message = "hey"
msg.Number = 123
// Note that msg.Name becomes "user" in the JSON
c.JSON(http.StatusOK, msg)
})
// Listen and serve on 0.0.0.0:8080
r.Run(":8080")
}      

Gin架構渲染

A. gin.Context.XML方法進行渲染

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/moreXML", func(c *gin.Context) {
// You also can use a struct
type MessageRecord struct {
Name string
Message string
Number int
}
var msg MessageRecord
msg.Name = "Lena"
msg.Message = "hey"
msg.Number = 123
c.XML(http.StatusOK, msg)
})
// Listen and serve on 0.0.0.0:8080
r.Run(":8080")
}      

3. 渲染模闆

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.LoadHTMLGlob("templates/**/*")
router.GET("/posts/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
"title": "Posts",
})
})
router.GET("/users/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "users/index.tmpl", gin.H{
"title": "Users",
})
})
router.Run(":8080")
}