goweb入门教程

news2025/1/24 10:45:25

本文是作者自己学习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框架的初始化,注册路由信息,关联控制器函数等。


未完,以后会更新的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从独立求存到登顶市场,荣耀为何能在手机红海翻出新的浪花?

对企业的价值评估&#xff0c;往往离不开对其所处行业前景的考量。在蓝海赛道布局的企业&#xff0c;往往要比在红海市场突围的企业更容易受到资本重视。 但这并非绝对&#xff0c;若是一家企业能够在饱和的红海市场中&#xff0c;实现新的增长&#xff0c;其蕴涵的成长价值便…

【LeetCode刷题】-- 78.子集

78.子集 class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> ans new ArrayList<>();List<Integer> list new ArrayList<>();dfs(0,nums,ans,list);return ans;}private void dfs(int cur,int…

maven 常用命令解析

maven 是什么 Maven 是一个流行的项目管理和构建工具&#xff0c;用于帮助开发人员管理 Java 项目的构建、依赖管理和文档生成等任务。它提供了一种标准化的项目结构和一套规范来管理项目的生命周期。 Maven 的主要功能包括&#xff1a; 项目对象模型&#xff08;Project Obje…

【AI数字人-论文】Wav2lip论文解读

文章目录 Wav2lip前言Lip-sync Expert DiscriminatorGeneratorvisual quality discriminator生成器总损失函数 论文 Wav2lip 前言 Wav2Lip 是第一个通用说话者的模型&#xff0c;可生成与真实同步视频相匹配的口型同步精度的视频&#xff0c;它的核心架构概括为“通过向训练有…

服务器之间的conda环境迁移

有的时候python环境中可能包含了我们编译好的很多库文件&#xff0c;如果在别的服务器想直接使用环境就会比较困难些。最好的办法就是直接迁移环境。而传统的迁移方法导出“*.yaml”环境配置的这种方法&#xff0c;实际是需要重新安装环境&#xff0c;对于这种安装好的环境是不…

龙芯loongarch64服务器编译安装maturin

前言 maturin 是一个构建和发布基于 Rust 的 Python 包的工具,但是在安装maturin的时候,会出现如下报错:error: cant find Rust compiler 这里记录问题解决过程中遇到的问题: 1、根据错误的提示需要安装Rust Compiler,首先去其官网按照官网给的解决办法提供进行安装 curl…

flink源码分析之功能组件(四)-slotpool组件II

简介 本系列是flink源码分析的第二个系列&#xff0c;上一个《flink源码分析之集群与资源》分析集群与资源&#xff0c;本系列分析功能组件&#xff0c;kubeclient&#xff0c;rpc&#xff0c;心跳&#xff0c;高可用&#xff0c;slotpool&#xff0c;rest&#xff0c;metrics&…

联想Lenovo购入一套DTX-1800线缆分析仪作为自检

福禄克经典6a线缆认证分析仪历经20年&#xff0c;依旧活跃在各个重要场合。线缆厂、布线商、网络工程师的利器&#xff0c;依旧经久不衰。 提供的最新原厂校准过的设备&#xff0c;精度和质量尤为重要。得到了充分的保证。使用起来&#xff0c;放心&#xff0c;可以送第三方计量…

数据结构-二叉树(2)

3.4堆的应用 3.4.1 堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 1.升序&#xff1a;建大堆&#xff1b; 2.降序&#xff1a;建小堆。 2. 利用堆删除思想来进行排序 这种写法有两个缺点&#xff1a; 1、先有一个堆的数据结构 …

详解Python中httptools模块的使用

httptools 是一个 HTTP 解析器&#xff0c;它首先提供了一个 parse_url 函数&#xff0c;用来解析 URL。这篇文章就来和大家聊聊它的用法吧&#xff0c;感兴趣的可以了解一下 如果你用过 FastAPI 的话&#xff0c;那么你一定知道 uvicorn&#xff0c;它是一个基于 uvloop 和 h…

Python (十五) 面向对象之多继承问题

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

电子学会C/C++编程等级考试2022年09月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:课程冲突 小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。 定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。 例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。 现在你需要求的是这 n 门课…

Verilog 入门(一)(Verilog 简介)

文章目录 什么是 Verilog HDL&#xff1f;Verilog 主要能力模块时延数据流描述方式 什么是 Verilog HDL&#xff1f; Verilog HDL是一种硬件描述语言&#xff0c;用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和…

Windows 11的新功能不适用于所有人,但对将要使用的人来说非常酷

正如一个新的预览版本所示&#xff0c;Windows 11即将为那些使用手写笔的人添加一些智能功能&#xff0c;以及其他改进。 这是预览版22635.2776&#xff08;也称为KB5032292&#xff09;&#xff0c;已推出Beta频道&#xff0c;这是发布预览版之前的最后一个测试方法&#xff…

Oracle E-Business Suite软件 任意文件上传漏洞(CVE-2022-21587)

0x01 产品简介 Oracle E-Business Suite&#xff08;电子商务套件&#xff09;是美国甲骨文&#xff08;Oracle&#xff09;公司的一套全面集成式的全球业务管理软件。该软件提供了客户关系管理、服务管理、财务管理等功能。 0x02 漏洞概述 Oracle E-Business Suite 的 Oracle…

创建Asp.net MVC项目Ajax实现视图页面数据与后端Json传值显示

简述回顾 继上篇文章创建的mvc传值这里说明一下Json传值。在mvc框架中&#xff0c;不可避免地会遇到前台传值到后台&#xff0c;前台接收后台的值的情况&#xff08;前台指view&#xff0c;后台指controller&#xff09;&#xff0c;有时只需要从控制器中返回一个处理的结果&a…

Lombok工具包的安装和使用

目录 一.常用的注解 二.引入依赖的两种方式 1.在maven仓库中引入 2.安装插件EditStarter 三.使用举例 四.原理 Lombok是一个java库&#xff0c;它可以自动插入到编辑器和构建工具中&#xff0c;增强java的性能。不需要再写getter、setter或equals方法&#xff0c;只要有一…

使用MAT分析内存泄漏(mac)

前言 今天主要简单分享下Eclipse的Memory Analyzer在mac下的使用。 一、Mat&#xff08;简称&#xff09;干什么的&#xff1f; 就是分析java内存泄漏的工具。 二、使用步骤 1.下载 mac版的现在也分芯片&#xff0c;别下错了。我这里是M2芯片的&#xff0c;下载的Arch64的。 …

软件测试面试时问你的项目经验,你知道该怎么说吗?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【中间件】DAL中间件intro

中间件middleware 内容管理 intro数据访问层why use DAL中间件主流DAL中间件方案DAL浅析 本文从理论上介绍一下服务化背景下的DAL中间件的理论并浅析相关中间件 cfeng之前work的时候产品发展到分离服务不分库的阶段&#xff0c;所以根本不需要DAL中间件&#xff0c;也没有分布式…