Go_gin框架web服务器上手操作

gogin框架

1)ginDemo

package main
import (
	"github.com/gin-gonic/gin"
)

// 请求处理函数
func sayHello(c *gin.Context) {
    // 返回JSON 格式的内容,gin.H就是一个建单的map[string]interface类型
    // c.JSON(statusCode, JSON) 将状态码和json返回给浏览器
    c.JSON(200, gin.H{
		"msg": "Hello Golang!",
	})
}

func main() {
	r := gin.Default() // 返回默认的路由引擎

	// 指定用户使用GET 请求访问/hello时,执行sayHello这个函数
	r.GET("/Hello", sayHello)

	// 启动服务
	_ = r.Run(":9090")
}

2)RESTful API接口开发

// 通过四种方式表明请求对应的动作	
	r.GET("/book", ...)  // 获取图书
	r.POST("/book", ...) // 创建图书
	r.PUT("/book", ...) // 更新图书
	r.DELETE("/book", ...) // 删除图书


// RESTful API风格,极简demo
package main
import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default() // 返回默认的路由引擎
	// 获取图书
	r.GET("/book", func(c *gin.Context){
		c.JSON(200, gin.H{
			"method" :"GET",
		})
	})
	// 创建图书
	r.POST("/book", func(c *gin.Context){
		c.JSON(200, gin.H{
			"method" :"POST",
		})
	})  
	// 更新图书
	r.PUT("/book", func(c *gin.Context){
		c.JSON(200, gin.H{
			"method" :"PUT",
		})
	})  
	// 删除图书
	r.DELETE("/book", func(c *gin.Context){
		c.JSON(200, gin.H{
			"method" :"DELETE",
		})
	}) 

	// 启动服务
	_ = r.Run(":9090")
}

3)HTML模板渲染

传个单对象,也可以传多个对象
模板大多已.tml结尾,必须utf8编码

package main

// 模板引擎渲染
/*
{{}} 包裹和表示需要传入的数据
{{.}}来访问后端串如的数据,若是复杂数据类型,如map可以通过{{.[key]}}访问,其他类型也是如此

模板引擎的使用:
	1.定义模板文件
	2.解析模板文件
	3.渲染模板
*/

// 目标:web服务器 提供用户访问,渲染模板返回前端
import (
	"fmt"
	"html/template"
	"net/http"
)

type User struct {
	Name string
	Gender string
	Age int
}

func main() {
	u1 := User{
		Name: "张三",
		Gender: "男",
		Age: 13,
	}
	http.HandleFunc("/index",func(w http.ResponseWriter, r *http.Request){
		t, err := template.ParseFiles("hello.tmpl")
		if err != nil {
			fmt.Println("解析模板错误")
			return
		}
		_ = t.Execute(w ,u1)
	})
	_ = http.ListenAndServe(":80",nil)
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
    <p style="color:red">姓名 {{ .u1.Name }}</p>
    <p style="color:red">性别 {{ .u1.Gender }}</p>
    <p style="color:red">年龄 {{ .u1.Age }}</p>
    <p style="color:red">姓名 {{ .map.name }}</p>
    <p style="color:red">性别 {{ .map.gender }}</p>
    <p style="color:red">年龄 {{ .map.age }}</p>

    模板判断
    <hr>
    {{ $v1 := 100 }} <!-- 模板中定义变量 -->
    {{ $age := .m1.age }}  <!-- 模板中定义变量 -->
    {{ if $v1 }}
    这里有值
    {{ else }}
    啥都没有
    {{ end }}

    比较运算
    <hr>
    {{ if lt .u1.Age 22 }}
    好好上学
    {{ else }}
    好好工作
    {{ end }}
    <br>

    遍历
    <hr>
    {{ range $id, $hobby := .map.hobby }}
    {{ $id }} - {{ $hobby }}<br>
    {{ end }}
	
    <hr>
    {{ with .map }} <!-- with .map 等同于 var . = .map -->
    {{ .name }}
    {{ .gender }}
    {{ .age }}
    {{end}}

    {{index .map.hobby 1 }}
</body>
</html>

4)自定义模板函数

package main

import(
	"fmt"
	"html/template"
	"net/http"
)
/*
自定义模板函数
	1.定义模板函数
	2.定义模板
	3.向模板注册自定义函数
	4.解析模板
	5.渲染模板
*/

func testTemplate(w http.ResponseWriter, r *http.Request){
	// 定义模板函数
	kua := func(name string) (string, error) {
		return name + "年轻帅气", nil
	}
	// 定义模板
	t := template.New("f.tmpl")
	// 注册自定义模板函数
	t.Funcs(template.FuncMap{
		"kua": kua,
	})

	_,err:=t.ParseFiles("f.tmpl")
	if err != nil {
		fmt.Println("解析失败")
		return
	}
	name:= "小王子"
	t.Execute(w,name)
}



func main(){
	http.HandleFunc("/",testTemplate)
	fmt.Println("web服务已启动")
	http.ListenAndServe(":8080", nil)
}

5)模板嵌套

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>嵌套模板</title>
</head>
<body>
    <h1>嵌套模板</h1>
    <hr>
    {{/*嵌套该文件外的单独的tmpl模板*/}}
    {{template "ul.tmpl"}}
    <hr>

    {{/*嵌套define 定义的模板*/}}
    {{template "ol.tmpl"}}
    <div>你好 {{.}}</div>
</body>
</html>

{{/*通过define 定义模板*/}}
{{define "ol.tmpl"}}
    我是ol模板下的内容
    <ol>
        <li>吃饭</li>
        <li>睡觉</li>
        <li>打豆豆</li>
    </ol>
{{end}}

//注意在http 处理函数中解析模板的顺序t.tmpl是主模板必须写在第一位

6)继承模板

package main

import (
	"fmt"
	"html/template"
	"net/http"
)

/*
模板继承
	1.创建处理请求函数
	2.解析模板内容,注意先写母模板再写子模板
	3.渲染模板并返回
*/
func main() {
	http.HandleFunc("/",func(w http.ResponseWriter, r *http.Request){
		t,err := template.ParseFiles("template/mu.tmpl")
		if err != nil {
			fmt.Println("ParentFiles is not error")
		}
		t.Execute(w,"小王子")
	})

	http.HandleFunc("/index", func(w http.ResponseWriter, r *http.Request) {
		// 解析模板,注意先写母模板再写子模板
		t, _ := template.ParseFiles("template/mu.tmpl", "template/index.tmpl")
		// 渲染模板,这里需要使用ExecuteTemplate,并且name只填写名字不用写路径,因为在解析的时候已经解析到了文件的路径
		_ = t.ExecuteTemplate(w, "index.tmpl", "小王子")
	})

	http.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) {
		// 解析模板,注意先写母模板再写子模板
		t, _ := template.ParseFiles("template/mu.tmpl", "template/home.tmpl")
		// 渲染模板
		_ = t.ExecuteTemplate(w, "home.tmpl", "小王子")
	})

	_ = http.ListenAndServe(":8080", nil)

}



//mu.tmpl
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板继承</title>
    <style>
        div {
            width: 100%;
            color: bisque;
            height: 13px;
        }

    </style>
</head>
<body>
<div>
    我是mu模板下的内容
</div>
	//block 自定义区域,content 指定自定义区域名称, . 接收参数并传递给子模板
    {{block "content" .}}{{end}}
</body>
</html>

//index.tmpl
// template 指定模板 .代表接收参数
{{template "mu.tmpl" .}}
//必须定义与母模板中block 名字一样的名
{{define "content"}}
    <h1>我是index文本</h1>
    <p>Hello {{.}}</p>
{{end}}

7)gin模板渲染

package main

//gin 框架

import (
	"github.com/gin-gonic/gin"
	"html/template"
	"net/http"
)

func main() {
	/*
	gin 框架处理模板请求解析
		1.定义默认gin路由
		2.定义safe 模板函数用于处理返回html格式文本(要在模板解析之前)
		3.渲染模板css 等静态文件(要在模板解析之前)
		4.加载解析模板(LoadHTMLGlob 模糊匹配)(LoadHTMLFiles 单个或多个文件指定)
		5.编写请求响应函数,这里我们写在一起没有单独拿出来写
		6.r.Run(":8080") 运行web 服务器
	*/

	r := gin.Default()

	// 定义safe 模板函数用于处理返回html格式文本
	r.SetFuncMap(template.FuncMap{
		"safe" : func(str string) template.HTML {
			return template.HTML(str)
		},
	})
	// 加载静态文件,第一个参数在html文件中别名路径相当于/xxx = template/statics,第二个参数是你的css静态文件存放的*目录
	// html文件中就可以<link rel="stylesheet" href="xxx/index.css">去引用css静态文件,
	// 同样也可以引用js文件<script src="xxx/index.js"></script>
	r.Static("/xxx","templates/statics")

	// 模板解析,加载所有templates下的文件夹(**)下的所有文件(*)
	r.LoadHTMLGlob("templates/**/*")
	// 模板解析
	//r.LoadHTMLFiles("templates/index.tmpl")
	// 模板渲染

	r.GET("/posts",func(c *gin.Context){
		c.HTML(http.StatusOK,"posts/index.tmpl",gin.H{
			"title": "<a href=\"http://www.liwenzhou.com\">李文周的博客</a>",
		})
	})
	r.GET("/users",func(c *gin.Context){
		c.HTML(http.StatusOK,"users/index.tmpl",gin.H{
			"title": "liwenzhou.com",
		})
	})

	_ = r.Run(":8080")
}

8)gin模板响应json数据

package mainimport "C"import (	"github.com/gin-gonic/gin"	"net/http")// gin 返回json 数据func main() {	r := gin.Default()	/*	返回json 数据		gin.H		map		Struct	*/	r.GET("/json", func(c *gin.Context) {		c.JSON(http.StatusOK,gin.H{			"jsona":"test",		})	})	r.GET("/json_struct", func(c *gin.Context) {		type Person struct {			Name string			Age int			Mssgin string		}		data := Person{"zhangsan",12,"打球"}		c.JSON(http.StatusOK,data)	})	r.GET("/json_map", func(c *gin.Context) {		data := map[string]interface{}{			"name": "zhangsan",			"age": 13,			"mssgin": "唱歌",		}		c.JSON(http.StatusOK,data)	})	_ = r.Run(":8080")}

9)gin 获取请求参数

package mainimport (	"github.com/gin-gonic/gin"	"net/http")func main() {	r := gin.Default()	// gin 获取get参数	r.GET("/index", func(c *gin.Context) {		user := c.Query("user")		password := c.DefaultQuery("password","123123")		c.JSON(http.StatusOK,gin.H{			"user": user,			"password": password,		})	})	// gin 获取form 参数	r.POST("/index", func(c *gin.Context) {		user := c.PostForm("user")		password := c.DefaultPostForm("password","123123")		c.JSON(http.StatusOK,gin.H{			"user": user,			"password": password,		})	})	// 获取请求参数uri 的内容,uri 相当于占位符,通过占位符获取到对应位置的内容	r.GET("/uri/:username/:password", func(c *gin.Context) {		username := c.Param("username")		password := c.Param("password")		c.		c.JSON(http.StatusOK,gin.H{			"username":username,			"password":password,		})	})	r.Run(":8080")}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值