goweb入门教程

本文是作者自己学习goweb时写的笔记,分享给大家,希望能有些帮助
前言:

关于web:本质

image-20231005163547291

​ web中最重要的就是浏览器和服务器的request(请求)和response(响应);

image-20231005164154245

一个请求对应一个响应。

一个请求对应一个响应!

一个请求对应一个响应!

一个请求对应一个响应!

image-20231103151829918

路由请求方式:GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH,ANY

gin

原理讲解

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"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="s/css/mycss.css">
</head>
<body>这是hello01.html文件,欢迎使用模板引擎
<span>这部分我想要使用红色</span>
//{{.}} 
{{.Name}}
</body>
</html>
{{end}}
渲染数组:

image-20231104094217075

模板文件:image-20231104094316348

image-20231104094506183

渲染结构体类型的数组:

image-20231104095340126

image-20231104095327497

渲染Map类型

image-20231104100115417

页面模板获取

image-20231104100209248

渲染入了多个结构体类型的map

第三个参数

image-20231104100628916

模板文件格式

image-20231104100716027

.代表上下文的map即a,.no1通过key得到value,再.Name就是通过value得到具体结构体字段

渲染切片

传入切片:

image-20231104101014182

模板文件格式:

image-20231104101048477

可以看出来和数组格式一样

企业级路由文件封装

主函数:

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)。

以下是响应的主要作用和组成部分:

  1. 传递请求处理结果
    • 响应用于向客户端传递服务器对客户端请求的处理结果。这可能包括请求的成功或失败,以及相关的数据或信息。
  2. HTTP状态码
    • HTTP状态码是响应的一部分,用于指示请求的处理状态。常见的状态码包括200(成功)、404(未找到)、500(服务器内部错误)等。状态码提供了关于请求处理的重要信息。
  3. 响应头部
    • 响应头部包含了与响应相关的元信息。这些信息包括内容类型(Content-Type)、内容长度(Content-Length)、响应时间等。响应头部帮助客户端正确解释响应主体。
  4. 响应主体
    • 响应主体是响应的核心部分,包含了实际的数据、内容或信息。它可以是HTML网页、JSON数据、图像、文本等,具体内容取决于响应的类型和用途。
  5. 告知客户端如何处理响应
    • 响应头部中的内容类型(Content-Type)指示了响应主体的数据类型。这使得客户端能够正确解析和处理响应数据。
  6. 控制缓存和缓存有效性
    • 响应头部中的缓存控制指令可以告知客户端和中间代理服务器如何缓存响应以及响应的有效期。这有助于提高性能并减少不必要的网络请求。
 ---------------------------响应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应用程序或客户端向服务器发出的一种行为,用于获取特定资源、执行操作或与服务器交互。请求的主要作用是向服务器发送请求以获取所需的数据、执行操作或与服务器进行通信。以下是请求的主要作用和组成部分:

  1. 获取资源
    • 请求可以用于获取服务器上的特定资源,例如网页、图像、视频、文档等。通过发送HTTP请求,客户端可以向服务器请求所需的资源,然后服务器会响应并将资源发送回客户端。
  2. 执行操作
    • 请求还可以用于执行特定的操作或命令。例如,通过HTTP POST请求,客户端可以向服务器提交表单数据,服务器会处理这些数据并采取相应的操作,如创建新记录、更新数据等。
  3. 与服务器通信
    • 请求还用于与服务器进行实时通信。WebSocket请求是一种实时通信协议,客户端和服务器可以通过WebSocket建立持久的双向通信通道,以便在不刷新页面的情况下进行实时更新和交互。
  4. 提供数据
    • 请求可以用于向服务器提供数据。通过HTTP PUT或HTTP POST请求,客户端可以将数据传递给服务器,服务器可以对这些数据进行处理、存储或分析。
  5. 传递请求参数
    • 请求通常包含请求参数,这些参数用于指定请求的细节和要求。例如,GET请求中的查询字符串参数、POST请求中的表单数据、HTTP头部中的信息等。
  6. 控制请求类型
    • 请求还可以用于控制请求的类型和行为。例如,HTTP请求方法(GET、POST、PUT、DELETE等)和HTTP头部可以用于指定请求的类型、内容类型、授权信息等。

请求通常由客户端(例如浏览器、移动应用程序)发起,然后由服务器进行响应。服务器根据请求中的信息和操作执行相应的逻辑,并将响应返回给客户端,以完成请求的目标。

请求和响应的关系

  1. 请求(Request)
    • 请求是由客户端(例如浏览器、移动应用程序)发送到服务器的消息,用于获取特定资源、执行操作或与服务器交互。
    • 请求包含了客户端的需求和指令,以告诉服务器它希望获取什么资源,执行什么操作,或传递什么数据。
    • 请求通常包括HTTP请求方法(如GET、POST、PUT、DELETE等)、请求头部(包括内容类型、授权信息等)、URL路径和查询参数等信息。
  2. 响应(Response)
    • 响应是服务器对客户端请求的回应,用于传递请求处理的结果、资源数据或其他信息。
    • 响应包括了HTTP状态码(例如200表示成功、404表示未找到、500表示服务器内部错误等)、响应头部(包括内容类型、缓存控制等)以及响应主体(包含实际数据或内容)。
    • 响应的目的是将请求处理的结果传递给客户端,以便客户端可以理解和使用这些数据或信息。
web标准的通信流程:
  1. 请求(Request):客户端(通常是浏览器或应用程序)发起一个请求,以获取特定资源、执行操作或与服务器交互。这个请求包括了客户端需要的信息,如请求的方法(GET、POST、PUT、DELETE等)、URL、请求头部和请求主体(如果有的话),还可能包括查询参数、请求体数据等。
  2. 服务器处理请求:一旦服务器接收到请求,它会根据请求中的信息,执行相应的操作。这可能包括检索数据库、处理业务逻辑、生成响应内容等。
  3. 响应(Response):服务器处理完请求后,会生成一个响应,包括一个 HTTP 状态码(表示请求的成功或失败)、响应头部(包含关于响应的元信息)、响应主体(包含实际的数据或内容)。服务器将响应发送回客户端。
  4. 客户端处理响应:客户端接收到服务器的响应后,会根据响应内容执行相应的操作,例如渲染页面、显示数据、执行进一步的操作等。

查询参数:Query

func _query(c *gin.Context) {

    fmt.Println(c.Query("user"))      //拿到单个查询参数
    fmt.Println(c.GetQuery("user"))   //判断是否查询成功
    fmt.Println(c.QueryArray("user")) //拿到多个查询参数

}//?user=张三&user=王五    查询参数

动态参数:Param

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

表单参数:PostForm

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)
}

原始参数:GetRawData

四大请求方式

image-20231005112147239

以文字为例:

// 以文字资源为例

// GET    /articles          文章列表    查
// GET    /articles/:id      文章详情    查
// POST   /articles          添加文章    增
// PUT    /articles/:id      修改某一篇文章 改
// DELETE /articles/:id      删除某一篇文章  删

image-20231005152501059

一脸懵逼,先接着看

请求头相关

请求头参数获取
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")
}

gin项目结构

├── 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框架的初始化,注册路由信息,关联控制器函数等。


未完,以后会更新的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/197212.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发ArkUI -常用布局

线性布局(Row/Column) 间距/主轴排列方式/交叉轴对齐方式 Column({}) {Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3)Column() {}.width(80%).height(50).backgroundColor(0xD2B48C)Column() {}.width(80%).height(50).backgroundColor(0xF5DEB3) } .width(1…

vue3通过v-model实现父子组件通信

单一值传递 父组件 <template><div ><h1>v-model实现父子组件通讯</h1><hr><child1 v-model"num"></child1><!-- 上下两个是等价的 --><child1 :modelValue"num" update:modelValue"handle&quo…

软件测试项目经验简历包装怎么写?

软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前&#xff0c;要经过一系列的严格测试&#xff0c;才能保证交付质量。 一、引言 1.编写目的 本文档…

有趣的代码——猜数字游戏的实现

前面介绍过很多的C语言常识&#xff0c;但是我们都知道“兴趣是最好的老师”&#xff0c;所以&#xff0c;今天我们用之前讲过的一些知识&#xff0c;加上部分新补充的知识点&#xff0c;写一个“猜数字”的小游戏&#xff0c;来丰富我们的编程学习生活&#xff0c;感受来自C语…

【小布_ORACLE】Part11-1--RMAN Backups笔记

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

云原生系列Go语言篇-编写测试Part 1

本文来自正在规划的​​Go语言&云原生自我提升系列​​&#xff0c;欢迎关注后续文章。 2000年以来&#xff0c;自动化测试的广泛应用可能比任何其他软件工程技术都更能提高代码质量。Go是一种专注于提高软件质量的语言和生态系统&#xff0c;很自然的在其标准库中包含了测…

《2023全球隐私计算报告》正式发布!

2023全球隐私计算报告 1、2023全球隐私计算图谱2、国内外隐私计算相关政策3、隐私计算技术的最新发展4、隐私计算技术的合规挑战5、隐私计算的应用市场动态6、隐私计算开源整体趋势7、隐私计算的未来趋势 11月23日&#xff0c;由浙江省人民政府、商务部共同主办&#xff0c;杭州…

Appium自动化如果出现报错怎么办?这么做确实解决问题

解决通过appium的inspector功能无法启动app的原因 在打开appium-desktop程序&#xff0c;点击inspector功能&#xff0c;填写app的配置信息&#xff0c;启动服务提示如下&#xff1a; 报错信息&#xff1a; An unknown server-side error occurred while processing the com…

牛客 算法题 记负均正II golang实现

题目 HJ105 记负均正II golang 实现 package mainimport ("bufio""fmt""io""os""strconv""strings" )func main() {scanner : bufio.NewScanner(os.Stdin)nums:make([]int,0)sum:0minus:0for scanner.Scan() {l…

java开发需要掌握的maven相关知识和Junit单元测试

maven简介 什么是maven&#xff1a; maven是一款管理和构建java项目的工具&#xff0c;是apache旗下的一个开源项目。 maven的作用&#xff1a; 依赖管理&#xff1a; 方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09;。 项目构建&#xff1a; 标准化的跨平台&#…

20 章 多线程

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thre…

【LeetCode】128. 最长连续序列——哈希的应用(3)

文章目录 1、思路2、解题方法3、复杂度时间复杂度:空间复杂度: 4、Code Problem: 128. 最长连续序列 1、思路 我会用一种做题者的思路来去看待这道题。 我们在乍一看到这道题的时候&#xff0c;看到它的时间复杂度要求为O(N)&#xff0c;然后又要求去找序列(就是让你判断这个…

stm32 TIM

一、TIM简介 TIM&#xff08;Timer&#xff09;定时器定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时定时器不仅具备基本的定时中断功能&…

前端 | iframe框架标签应用

文章目录 &#x1f4da;嵌入方式&#x1f4da;图表加载显示&#x1f4da;100%嵌入及滑动条问题&#x1f4da;加载动画保留 前情提要&#xff1a; 计划用iframe把画好的home1.html&#xff08;echarts各种图表组成的html数据大屏&#xff09;嵌入整合到index.html&#xff08;搭…

只需十分钟快速入门Python,快速了解基础内容学习。零基础小白入门适用。

文章目录 简介特点搭建开发环境版本hello world注释文件类型变量常量数据类型运算符和表达式控制语句数组相关函数相关字符串相关文件处理对象和类连接mysql关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源…

摇滚史密斯2014重置版外接声卡

摇滚史密斯2014重置版外接声卡 前提 由于rs_asio是通过模拟原厂线的方法来使游戏可以支持声卡的&#xff0c;因此&#xff0c;声卡的采样频率需要满足原厂线要求&#xff0c;即采样率可以设置为 48000 Hz。 我使用的是 Sonic Cube 这款声卡&#xff0c;非常幸运&#xff0c;…

汽车电子 -- 车载ADAS之FCW(前方碰撞预警)

相关法规文件: FCW: GB∕T 33577-2017 智能运输系统 车辆前向碰撞预警系统 性能要求和测试规程 一、前方碰撞预警 FCW&#xff08; Forward Collision Warning&#xff09; 参看&#xff1a;法规标准-GB/T 33577标准解读(2017版) 1、状态机 系统关闭 当车辆前向碰撞预警系…

unity学习笔记07

一、组件 有几个物体他们之间有着重复的功能&#xff0c;该如何避免重复的去写代码&#xff1f; 可以将一些相同的功能写成一个组件&#xff0c;也就是组件就等同于功能。 什么是组件&#xff1f; 在Unity中&#xff0c;游戏物体是不具备任何功能的&#xff0c;如果想要为其…

香港科技大学数据建模(MSc DDM)硕士学位项目(2024年秋季入学)招生宣讲会-武汉专场

时间&#xff1a;2023 年12 月 8 日&#xff08;周五&#xff09; 15:00 地点&#xff1a;华中科技大学大学生活动中心B座303 嘉宾教授&#xff1a;张锐 教授 项目旨在培养科学或工程背景的学员从数据中提取信息的数据建模能力&#xff0c;训练其拥有优秀的解难和逻辑思考与分…

3.OpenResty系列之Nginx反向代理

1. Nginx简介 Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器 什么是反向代理&#xff1f; 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受 internet 上的连接请求&#x…