package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default() // 使用Default建立路由
r.GET("/", func(c *gin.Context) { // 這個c就是上下文,這個路由接收GET請求
c.String(http.StatusOK, "hello world") // 傳回狀态碼和資料
})
_ = r.Run(":8000") //監聽端口預設為8080
}
r.POST("carts", api.CreateCart) // POST請求,一般送出表單
r.GET("carts/:id", api.ShowCarts) //GET請求,一般擷取資料
r.PUT("carts", api.UpdateCart) //PUT請求,一般修改資料
r.DELETE("carts", api.DeleteCart) // DELETE請求,一般删除資料
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/user/:name/:action", func(c *gin.Context) {
name := c.Param("name") // 使用Param可以擷取路由URL裡面的資料
action := c.Param("action")
c.String(http.StatusOK, name+" rush "+action)
})
_ = r.Run(":8000")
}
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/form", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s", username, password))
})
_ = r.Run(":8000")
}
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/upload", func(c *gin.Context) {
file, err := c.FormFile("file") // file是參數名稱
if err != nil {
c.String(500, "上傳圖檔出錯") //出錯就會傳回這個
}
c.SaveUploadedFile(file, file.Filename) // 儲存檔案
c.String(http.StatusOK, file.Filename) // 傳回狀态碼
})
_ = r.Run(":8000")
}
import (
"github.com/gin-gonic/gin"
"net/http"
)
func helloHandler(c *gin.Context) { // 把處理函數放在這裡,可以處理一些複雜的業務
c.JSON(http.StatusOK, gin.H {
"message": "Hello World!", // 通過這個 gin.H{} 進行json格式的傳回
})
}
// Router 配置路由資訊
func Router() *gin.Engine {
r := gin.Default()
r.GET("/hello", helloHandler) // 這樣這個路由就比較簡潔了。
return r
}
type Product struct {
Name string `form:"name" json:"name"`
CategoryID int `form:"category_id" json:"category_id"`
Title string `form:"title" json:"title" binding:"required,min=2,max=100"`
Info string `form:"info" json:"info" binding:"max=1000"`
ImgPath string `form:"img_path" json:"img_path"`
Price string `form:"price" json:"price"`
DiscountPrice string `form:"discount_price" json:"discount_price"`
OnSale string `form:"on_sale" json:"on_sale"`
Num string `form:"num" json:"num"`
}
func helloHandler(c *gin.Context) { // 把處理函數放在這裡,可以處理一些複雜的業務
var data Product
if err := c.ShouldBindJSON(&data); err != nil {
// 進行資料的綁定,這樣傳過來的資料就會傳入這個data當中
// gin.H封裝了生成json資料的工具
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) // 傳回錯誤資訊
return
}
c.JSON(http.StatusOK, gin.H{"status": "200"})
}
// Router 配置路由資訊
func Router() *gin.Engine {
r := gin.Default()
r.GET("/hello", helloHandler) // 這樣這個路由就比較簡潔了。
return r
}
func helloHandler(c *gin.Context) { // 把處理函數放在這裡,可以處理一些複雜的業務
var data Product
if err := c.Bind(&data); err != nil {
// Bind()預設解析并綁定form格式,這樣傳過來的資料就會傳入這個data當中
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) // 傳回錯誤資訊
return
}
c.JSON(http.StatusOK, gin.H{"status": "200"})
}
type Product struct {
Name string `form:"name" json:"name" uri:"name”`
CategoryID int `form:"category_id" json:"category_id" uri:"category_id"`
Title string `form:"title" json:"title" uri:“title binding:"required,min=2,max=100"`
Info string `form:"info" json:"info" uri:“info binding:"max=1000"`
ImgPath string `form:"img_path" json:"img_path" uri:"img_path"`
Price string `form:"price" json:"price" uri:“price`
DiscountPrice string `form:"discount_price" json:"discount_price" uri:"discount_price"`
OnSale string `form:"on_sale" json:"on_sale" uri:"on_sale"`
Num string `form:"num" json:"num" uri:"num"`
}
func helloHandler(c *gin.Context) { // 把處理函數放在這裡,可以處理一些複雜的業務
var data Product
if err := c.ShouldBindUri(&data); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) // 傳回錯誤資訊
return
}
c.JSON(http.StatusOK, gin.H{"status": "200"})
}
type User struct {
Phone string `form:"phone" binding:"required,gt=10"` //不能為空并且大于10
Name string `form:"name" binding:"required"`
Birthday time.Time `form:"birthday" time_format:"2006-01-02"`
// 滿足格式才能接收,減少了if-else的判斷
}
type User struct {
Phone string `form:"phone" binding:"required,gt=10"` //不能為空并且大于10
Name string `form:"name" binding:"NotNullAndAdmin"` // 自定義一個驗證
Birthday time.Time `form:"birthday" time_format:"2006-01-02"`
// 滿足格式才能接收,減少了if-else的判斷
}
func nameNotNullAndAdmin(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
if value, ok := field.Interface().(string); ok {
return value != "" && !("admin" == value)// 字段不能為空,并且不等于 admin
}
return true
}
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
_ = v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin) //注冊定義的驗證方法
}
func main() {
r := gin.Default()
r.GET("/json",JsonHandler)
_ = r.Run(":8000")
}
func JsonHandler(c *gin.Context) {
c.JSON(200, gin.H{"message": "HelloJson", "status": 200})
}
func main() {
r := gin.Default()
r.GET("/struct", StructHandler)
_ = r.Run(":8000")
}
func StructHandler(c *gin.Context) {
var msg struct {
Name string
Message string
Number int
}
msg.Name = "FanOne"
msg.Message = "Golang"
msg.Number = 10001
c.JSON(200, msg)
}
func main() {
r := gin.Default()
r.GET("/xml", XMLHandler)
_ = r.Run(":8000")
}
func XMLHandler(c *gin.Context) {
c.XML(200, gin.H{"message": "HelloXml"})
}
func main() {
r := gin.Default()
r.GET("/yaml", YAMLHandler)
_ = r.Run(":8000")
}
func YAMLHandler(c *gin.Context) {
c.YAML(200, gin.H{"message": "HelloYaml"})
}
func main() {
r := gin.Default()
r.GET("/protobuf", ProtoBufHandler)
_ = r.Run(":8000")
}
func ProtoBufHandler(c *gin.Context) {
reps := []int64{int64(1), int64(2)}
// 定義資料
label := "label"
// 傳protobuf格式資料
data := &protoexample.Test{
Label: &label,
Reps: reps,
}
c.ProtoBuf(200, data)
}
func main() {
r := gin.Default()
r.LoadHTMLGlob("tempate/*") // 加載你的模闆檔案 就是html檔案嗷
r.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", gin.H{"msg": "HelloWorld", "status": "200"})
})
r.Run()
}
func main() {
r := gin.Default()
r.Static("/assets", "./assets") // 需要定義一個靜态檔案目錄
r.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", gin.H{"msg": "HelloWorld", "status": "200"})
})
r.Run()
}
func main() {
r := gin.Default()
r.GET("/index", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
})
r.Run()
}
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
store := cookie.NewStore([]byte("something-very-secret")) // 存儲
r.Use(sessions.Sessions("mysession", store)) // 其實這也算是一個中間件
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f)
// gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)