响应
字符串响应&JSON响应
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default() //定义默认路由
r.GET("/hello", func(c *gin.Context) {
//字符串响应
c.String(http.StatusOK, "hello, world!\n")
//JSON响应
c.JSON(http.StatusOK, gin.H{
"status": "ok\n",
})
})
r.Run(":9090") //默认开启8080端口
}
HTML响应
func main() {
r := gin.Default() //定义默认路由
//r.LoadHTMLGlob("templates/*") //加载目录下所有模板文件
r.LoadHTMLFiles("templates/index.tmpl") //加载列出的模板文件
r.GET("/hello", func(c *gin.Context) {
//html响应(先加载模板后进行渲染)
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"title":"Hello, HTML!",
})
})
r.Run(":9090") //默认开启8080端口
}
index.tmpl
<html>
<h1>
{{ .title }}
</h1>
</html>
重定向响应
func main() {
r := gin.Default()
r.GET("/redirect", func(c *gin.Context){
c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
})
r.Run()
}
请求及参数获取
func main() {
r := gin.Default()
// //获取URL参数(?后的由&连接的) http://127.0.0.1:9090/user?name=naruto
r.GET("/user", func(c *gin.Context) {
// name := c.Query("name")
// name := c.DefaultQuery("name", "lili") //未查询到就设置为默认值
name, ok := c.GetQuery("name") //取不到参数就返回空以及false
//错误检查
if !ok {
name = "lili" //设置默认值
}
age, ok := c.GetQuery("age") //取不到参数就返回空以及false
//错误检查
if !ok {
name = "lili" //设置默认值
}
c.JSON(http.StatusOK, gin.H{
"name": name,
"age": age,
})
})
//获取API参数
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello, "+name)
})
//获取form表单参数
r.POST("/user", func(c *gin.Context){
name := c.DefaultPostForm("name", "lili") //设置默认值
password := c.PostForm("password")
c.String(http.StatusOK, "Your name is " + name + ", your password is " + password)
})
r.Run(":9090")
}
文件传输
保存单个上传的文件
func main() {
r := gin.Default()
r.POST("/user", func(c *gin.Context) {
file, err := c.FormFile("file") //接收文件及返回错误信息(不上传文件)
//错误处理
if err != nil {
c.String(http.StatusOK, "err is :"+err.Error()+" ; Please upload a file.")
}
dst := "./" + file.Filename //定义存储路径
c.SaveUploadedFile(file, dst)
c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
})
r.Run()
}
保存多个上传的文件
func main() {
r := gin.Default()
r.MaxMultipartMemory = 8 << 20 //设定缓存为8M
r.POST("/upload", func(c *gin.Context) {
form, err := c.MultipartForm()
if err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
}
files := form.File["files"]
for _, file := range files {
if err := c.SaveUploadedFile(file, file.Filename); err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("upload file err: %s", err.Error()))
return
}
}
c.String(http.StatusOK, fmt.Sprintf("Uploaded successfully %d files.", len(files)))
})
r.Run()
}
提供本地文件以供下载(静态文件)
func main() {
r := gin.Default()
//显示文件夹内的所有内容提供下载
r.StaticFS("/showDir", http.Dir("."))
r.StaticFS("/tem", http.Dir("./templates"))
//显示指定路径的文件
r.StaticFile("/picture", "C:/computerlanguange/go_code/0822/tmp/屏幕截图.png")
r.Run()
}
数据绑定
知道确切类型(JSON, Form, Uri, Xml...)
func main(){
type sss struct{
User string `form: "username" json:"user" uri:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
r := gin.Default()
r.POST("bind", func(c *gin.Context){
var json sss
if err := c.ShouldBindJSON(&json); err != nil{
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{"status": "ok"})
})
r.Run()
}
不知道确切类型
func main(){
type sss struct{
User string `form: "username" json:"user" uri:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
r := gin.Default()
r.POST("bind", func(c *gin.Context){
var Info sss
if err := c.ShouldBind(&Info); err != nil{
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{"status": "ok"})
})
r.Run()
}
组和中间件
组(公共URI开头)
func main() {
r := gin.Default()
group1 := r.Group("/group1")
{
group1.GET("/login", func(c *gin.Context) {
c.String(http.StatusOK, "login successfully.")
})
group1.GET("/logout", func(c *gin.Context) {
c.String(http.StatusOK, "logout successfully.")
})
}
r.Run()
}
中间件
自定义中间件函数
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
time1 := time.Now()
c.Next()
times := time.Since(time1)
fmt.Println("times: ", times)
}
}
用中间件(中间件函数的输出信息在服务端看)
func main() {
r := gin.Default()
// 单个响应的中间件用法
r.GET("/test", MiddleWare(), func(c *gin.Context) {
c.String(http.StatusOK, "OK!")
})
// 多个响应的中间件用法
r.Use(MiddleWare())
{
r.GET("test1", func(c *gin.Context) {
c.String(http.StatusOK, "OK!")
})
r.POST("test1", func(c *gin.Context) {
c.String(http.StatusOK, "OK!")
})
}
r.Run()
}