目前笔记还未完全更新完,还比较乱,未更新完毕,记作随笔
前言:
关于web:本质
web中最重要的就是浏览器和服务器的request(请求)和response(响应);
一个请求对应一个响应。
一个请求对应一个响应!
一个请求对应一个响应!
一个请求对应一个响应!
路由请求方式:GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH,ANY
package main
import "github.com/gin-gonic/gin" //导包
func Hello(c *gin.Context) {
//gin.Context是gin框架的上下文,封装了request(请求)和response(响应)
//里边是对页面的渲染效果,即给浏览器响应什么内容,可以是string的内容,也可以是json的内容,也可以是html的内容
c.String(200, "这是我的第一个gin框架程序")
}
func main() {
//Default返回一个默认的路由引擎Engine,他是框架非常重要的数据结构,是框架的入口,
//所有的注册路由都是在这个结构体上进行的,所以在使用gin框架时,一定要先初始化一个Engine
//引擎-框架核心发动机-默认服务器,整个web服务都由它驱动
//Default底层调用了New(),相当于定义的升级版,多加了中间件-engine.Use(Logger(),Recovery())
r := gin.Default()
//r := gin.New()
//路由:通过访问"/"的GET请求,来执行后面的匿名函数
//前面“/”是路由规则,后边是路由函数,是一个协程
//路由请求方式:GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH,ANY
r.GET("/", func(c *gin.Context) {
c.String(200, "这是我的第一个gin框架程序")
})
//或 写成 r.GET("/", Hello)
//启动引擎,服务器启动传入host+port,默认8080端口
r.Run(":8080")
}
主函数:
func main() {
r := gin.Default()// 创建引擎
//加载文件
r.LoadHTMLGlob("templates/**/*")//指定目录
//加载静态文件
r.Static("/s", "static") //指定静态文件目录s是真实目录static
r.GET("/demo01", myfunc.Hello)
//r.GET("/Hello", Hello)
r.Run(":8080")
}
方法函数:
package myfunc
import "github.com/gin-gonic/gin"
type Student struct {
Name string `json:"name"`
Age int `json:"age"`
}
func Hello(c *gin.Context) {
//name := "你好我是姗姗老师"//string类型文件
c.HTML(200, "demo01/hello01.html", name)//string类型文件传入
c.HTML(200, "demo01/hello01.html", Student{Name: "张三", Age: 18})
//结构体类型文件传入
}
HTML文件:
{{define "demo01/hello01.html"}}
Title
这是hello01.html文件,欢迎使用模板引擎
这部分我想要使用红色
//{{.}}
{{.Name}}
{{end}}
页面模板获取
第三个参数
模板文件格式
.代表上下文的map即a,.no1通过key得到value,再.Name就是通过value得到具体结构体字段
传入切片:
模板文件格式:
可以看出来和数组格式一样
主函数:
import (
"awesomeProject1/demo/router"
)
func main() {
r:=router.Router()
err := r.Run(":8080")
if err != nil {
return
}
}
router文件
package router
import "github.com/gin-gonic/gin"
func Router() *gin.Engine {//user目录下的请求全都放到这个文件里,看这更清晰
r := gin.Default()
user := r.Group("/user")
{
user.POST("/list", func(c *gin.Context) {
c.String(200, "user add")
})
user.PUT("/add", func(c *gin.Context) {
c.String(200, "user add")
})
user.DELETE("/delete", func(c *gin.Context) {
c.String(200, "user delete")
})
}
return r
}
最后返回r
响应(Response)是Web应用程序向客户端发送的数据,用于传递请求处理的结果或内容。在HTTP协议中,响应是服务器端向客户端发送的数据,它包含了一个HTTP状态码、响应头部和响应主体(body)。
以下是响应的主要作用和组成部分:
---------------------------响应string
func _string(c *gin.Context) {
//返回字符串
c.String(200, "你好阿")
//状态码,200表示正常响应
}
func main() {
router := gin.Default()
//router.GET("/", _string)
err := router.Run(":80")
if err != nil {
return
}
}
、、、、、、、、、、、、、、、、、、响应json、、、、、、、、、、、、、、、、
func _json(c *gin.Context) {
type UserInfo struct {
UserName string `json:"user_name"`
Age int `json:"age"`
Password string `json:"-"`
}
user := UserInfo{"峰峰", 20, "123456"}
c.JSON(200, user)
}
func main() {
router := gin.Default()
//router.GET("/", _string)
router.GET("/", _json)
err := router.Run(":80")
if err != nil {
return
}
}
json最常用,其他很少用到;
在golang中么有相对路径,只有相对项目的路径
router.GET("/redirect", func(c *gin.Context) {
//支持内部和外部的重定向
c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com/")
})
//redirect指字节写的网址,后边是跳转到什么网址
301 Moved Permanently
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
302 Found
请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
请求(Request)是Web应用程序或客户端向服务器发出的一种行为,用于获取特定资源、执行操作或与服务器交互。请求的主要作用是向服务器发送请求以获取所需的数据、执行操作或与服务器进行通信。以下是请求的主要作用和组成部分:
请求通常由客户端(例如浏览器、移动应用程序)发起,然后由服务器进行响应。服务器根据请求中的信息和操作执行相应的逻辑,并将响应返回给客户端,以完成请求的目标。
func _query(c *gin.Context) {
fmt.Println(c.Query("user")) //拿到单个查询参数
fmt.Println(c.GetQuery("user")) //判断是否查询成功
fmt.Println(c.QueryArray("user")) //拿到多个查询参数
}//?user=张三&user=王五 查询参数
func _param(c *gin.Context) {
fmt.Println(c.Param("user_id"))
fmt.Println(c.Param("book_id"))
}
func main() {
router := gin.Default()
router.GET("/param/:user_id/", _param)
router.GET("/param/:user_id/:book_id", _param)
router.Run(":80")
}
//?param/12
?param/12/123
func _form(c *gin.Context) { //表单,请求表单,表单参数
fmt.Println(c.PostForm("name"))
fmt.Println(c.PostFormArray("name"))
fmt.Println(c.DefaultPostForm("addr", "四川省"))
//没传设置默认值
forms, err := c.MultipartForm() //接收所有form参数,包括文件
fmt.Println(forms, err)
}
以文字为例:
// 以文字资源为例
// GET /articles 文章列表 查
// GET /articles/:id 文章详情 查
// POST /articles 添加文章 增
// PUT /articles/:id 修改某一篇文章 改
// DELETE /articles/:id 删除某一篇文章 删
一脸懵逼,先接着看
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"strings"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
//首字母大小写不区分,单词与单词之间用 - 连接
fmt.Println(c.GetHeader("User-Agent"))
//Header是一个普通的string
fmt.Println(c.Request.Header)
c.JSON(200, gin.H{"msg": "成功"})
})
router.GET("/index", func(c *gin.Context) {
userAgent := c.GetHeader("User-Agent")
//用正则去匹配
//字符串的包含匹配
if strings.Contains(userAgent, "python") { //爬虫来了
c.JSON(0, gin.H{"data": " 这是响应给给爬虫的数据"})
return
}
c.JSON(0, gin.H{"data": ""})
})
router.Run(":80")
}
├── conf #项目配置文件目录
│ └── config.toml #大家可以选择自己熟悉的配置文件管理工具包例如:toml、xml等等
├── controllers #控制器目录,按模块存放控制器(或者叫控制器函数),必要的时候可以继续划分子目录。
│ └── user.go
├── models #模型目录,负责项目的数据存储部分,例如各个模块的Mysql表的读写模型。
│ ├── food.go
│ └── user.go
├── static #静态资源目录,包括Js,css,jpg等等,可以通过Gin框架配置,直接让用户访问。
│ ├── css
│ ├── images
│ └── js
├── logs #日志文件目录,主要保存项目运行过程中产生的日志。
└── views #视图模板目录,存放各个模块的视图模板,当然有些项目只有api,是不需要视图部分,可以忽略这个目录
│ └── index.html
├── main.go #项目入口,这里负责Gin框架的初始化,注册路由信息,关联控制器函数等。