goweb入门教程
本文是作者自己学习goweb时写的笔记,分享给大家,希望能有些帮助
前言:
关于web:本质

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

一个请求对应一个响应。
一个请求对应一个响应!
一个请求对应一个响应!
一个请求对应一个响应!

路由请求方式:GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH,ANY
gin
原理讲解
package mainimport "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,ANYr.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是真实目录staticr.GET("/demo01", myfunc.Hello)//r.GET("/Hello", Hello)r.Run(":8080")
}
方法函数:
package myfuncimport "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}}
渲染数组:

模板文件:
或
渲染结构体类型的数组:


渲染Map类型

页面模板获取

渲染入了多个结构体类型的map
第三个参数

模板文件格式

.代表上下文的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)。
以下是响应的主要作用和组成部分:
- 传递请求处理结果:
- 响应用于向客户端传递服务器对客户端请求的处理结果。这可能包括请求的成功或失败,以及相关的数据或信息。
- HTTP状态码:
- HTTP状态码是响应的一部分,用于指示请求的处理状态。常见的状态码包括200(成功)、404(未找到)、500(服务器内部错误)等。状态码提供了关于请求处理的重要信息。
- 响应头部:
- 响应头部包含了与响应相关的元信息。这些信息包括内容类型(Content-Type)、内容长度(Content-Length)、响应时间等。响应头部帮助客户端正确解释响应主体。
- 响应主体:
- 响应主体是响应的核心部分,包含了实际的数据、内容或信息。它可以是HTML网页、JSON数据、图像、文本等,具体内容取决于响应的类型和用途。
- 告知客户端如何处理响应:
- 响应头部中的内容类型(Content-Type)指示了响应主体的数据类型。这使得客户端能够正确解析和处理响应数据。
- 控制缓存和缓存有效性:
- 响应头部中的缓存控制指令可以告知客户端和中间代理服务器如何缓存响应以及响应的有效期。这有助于提高性能并减少不必要的网络请求。
---------------------------响应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应用程序或客户端向服务器发出的一种行为,用于获取特定资源、执行操作或与服务器交互。请求的主要作用是向服务器发送请求以获取所需的数据、执行操作或与服务器进行通信。以下是请求的主要作用和组成部分:
- 获取资源:
- 请求可以用于获取服务器上的特定资源,例如网页、图像、视频、文档等。通过发送HTTP请求,客户端可以向服务器请求所需的资源,然后服务器会响应并将资源发送回客户端。
- 执行操作:
- 请求还可以用于执行特定的操作或命令。例如,通过HTTP POST请求,客户端可以向服务器提交表单数据,服务器会处理这些数据并采取相应的操作,如创建新记录、更新数据等。
- 与服务器通信:
- 请求还用于与服务器进行实时通信。WebSocket请求是一种实时通信协议,客户端和服务器可以通过WebSocket建立持久的双向通信通道,以便在不刷新页面的情况下进行实时更新和交互。
- 提供数据:
- 请求可以用于向服务器提供数据。通过HTTP PUT或HTTP POST请求,客户端可以将数据传递给服务器,服务器可以对这些数据进行处理、存储或分析。
- 传递请求参数:
- 请求通常包含请求参数,这些参数用于指定请求的细节和要求。例如,GET请求中的查询字符串参数、POST请求中的表单数据、HTTP头部中的信息等。
- 控制请求类型:
- 请求还可以用于控制请求的类型和行为。例如,HTTP请求方法(GET、POST、PUT、DELETE等)和HTTP头部可以用于指定请求的类型、内容类型、授权信息等。
请求通常由客户端(例如浏览器、移动应用程序)发起,然后由服务器进行响应。服务器根据请求中的信息和操作执行相应的逻辑,并将响应返回给客户端,以完成请求的目标。
请求和响应的关系
- 请求(Request):
- 请求是由客户端(例如浏览器、移动应用程序)发送到服务器的消息,用于获取特定资源、执行操作或与服务器交互。
- 请求包含了客户端的需求和指令,以告诉服务器它希望获取什么资源,执行什么操作,或传递什么数据。
- 请求通常包括HTTP请求方法(如GET、POST、PUT、DELETE等)、请求头部(包括内容类型、授权信息等)、URL路径和查询参数等信息。
- 响应(Response):
- 响应是服务器对客户端请求的回应,用于传递请求处理的结果、资源数据或其他信息。
- 响应包括了HTTP状态码(例如200表示成功、404表示未找到、500表示服务器内部错误等)、响应头部(包括内容类型、缓存控制等)以及响应主体(包含实际数据或内容)。
- 响应的目的是将请求处理的结果传递给客户端,以便客户端可以理解和使用这些数据或信息。
web标准的通信流程:
- 请求(Request):客户端(通常是浏览器或应用程序)发起一个请求,以获取特定资源、执行操作或与服务器交互。这个请求包括了客户端需要的信息,如请求的方法(GET、POST、PUT、DELETE等)、URL、请求头部和请求主体(如果有的话),还可能包括查询参数、请求体数据等。
- 服务器处理请求:一旦服务器接收到请求,它会根据请求中的信息,执行相应的操作。这可能包括检索数据库、处理业务逻辑、生成响应内容等。
- 响应(Response):服务器处理完请求后,会生成一个响应,包括一个 HTTP 状态码(表示请求的成功或失败)、响应头部(包含关于响应的元信息)、响应主体(包含实际的数据或内容)。服务器将响应发送回客户端。
- 客户端处理响应:客户端接收到服务器的响应后,会根据响应内容执行相应的操作,例如渲染页面、显示数据、执行进一步的操作等。
查询参数: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
四大请求方式

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

一脸懵逼,先接着看
请求头相关
请求头参数获取
package mainimport ("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是一个普通的stringfmt.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框架的初始化,注册路由信息,关联控制器函数等。
未完,以后会更新的
相关文章:
goweb入门教程
本文是作者自己学习goweb时写的笔记,分享给大家,希望能有些帮助 前言: 关于web:本质 web中最重要的就是浏览器和服务器的request(请求)和response(响应); 一个请求对应一个响应。 一个请求对应一个响应&…...
量子计算:探索未来的计算技术
量子计算:探索未来的计算技术 引言 在过去的几十年里,我们见证了计算机技术从简单的计算和存储发展到复杂的数据处理和人工智能的飞速进步。然而,随着我们进一步探索科技的前沿,传统的计算方法开始显示出其局限性。在这种情况下,量子计算——一种基于量子力学原理的新型计…...
HarmonyOS应用开发者基础认证考试题目及答案
一、判断题 Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(True) 所有使用Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数。 错误(False) 每调用一次ro…...
c# 文件读取和写入
文件写入 using System.Collections.Generic; namespace demo1;/// <summary> /// System.IO下的所有的Stream类是所有数据流的基类 /// 流是用于传输数据的对象,流就是用来传输数据的 /// 数据传输的两种方式:1、数据从外部源传输到程序中&#…...
【MySQL库的操作】
目录: 前言库的操作创建数据库字符集和校验规则校验规则对数据库的影响 选择和查看数据库修改数据库删除数据库备份注意事项查看连接情况 总结 前言 剑指offer:一年又二天 库的操作 创建、选择、查看、修改、删除与备份。 创建数据库 CREATE DATABASE…...
rocketmq 集群环境部署及与spring cloud 集成
1 下载zip 安装包 rocketmq-all-5.1.4-bin-release.zip 2 修改启动配置,防止默认内存配置过高 runserver.sh/runbroker.sh/tools.sh 3 启动namesrv nohup sh bin/mqnamesrv >>namesrv.log & 4 启动brokerproxy 单点模式: nohup sh bin…...
SpringBoot——配置及原理
优质博文:IT-BLOG-CN 一、Spring Boot全局配置文件 application.properties与application.yml配置文件的作用:可以覆盖SpringBoot配置的默认值。 ◀ YML(is not a Markup Language:不仅仅是一个标记语言)࿱…...
fiddler抓包安卓
一、打断点 1、安卓手机和电脑在同一局域网下,手机连接的网络开启手动代理,ip填写电脑ip,端口填写fiddler中配置的端口。 ip查看: 端口配置:tools-options-connections 2、安装证书,手机浏览器输入电脑ip…...
Maven 进阶学习指南---setting详解
前言 当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要 Json 序列化的时候需要用到 FastJson 组件,我们可以通过下载对应 jar 包加载到项目中。但当一个大的项目同时需要依赖各种各样的外部服务,就存在着配置繁琐、依…...
人工智能与我们的生活
人工智能对我们的生活影响有多大 1. 人工智能的领域 人工智能涉及的领域广泛,包括但不限于: a. 医疗保健领域 人工智能在医疗诊断、药物研发、患者管理等方面发挥了重要作用。医疗影像分析、基因组学研究等都受益于人工智能技术,为医学领…...
前端将blob转换为可下载的url及下载
一.转换 //将blob转换为url const changeBlobToUrl blobData > {return new Promise(resolve > {//创建Blob对象const blob new Blob([blobData])// 创建FileReader对象const reader new FileReader()reader.onload function (e) {resolve(e.target.result)}// 使用F…...
LVS-DR实验
实验前准备 DR服务器:192.168.188.11 192.168.188.15 NFS服务器:192.168.188.14 Web服务器1:192.168.188.12 Web服务器2:192.168.188.13 Vip:192.168.188.188 客户端:192.168.188.200 配置负载均衡调度…...
MYSQL索引使用注意事项
索引使用注意事项: 1.索引列运算 不要在索引列上进行运算操作,否则索引将失效; 2.字符串不加引号 字符串类型使用时,不加引号,否则索引将失效; 3.模糊查询 如果仅仅是尾部模糊匹配,索引将不会失…...
深入理解Java中的String、StringBuilder和StringBuffer(每天一个技术点,第一天)
大家好,我是你们的博主每天一个技术点。今天,我们将探讨Java中的一个重要主题:String、StringBuilder和StringBuffer。这些类在Java编程中无处不在,但它们之间的区别和用法可能并不是所有人都清楚。所以,让我们深入了解…...
PHP逻辑运算符学习资料
PHP逻辑运算符 在PHP中,逻辑运算符用于组合和比较不同的逻辑条件。下面是PHP中常用的逻辑运算符示例: 1. 与运算符(&& 或 and) $age 25; $isStudent true;if ($age > 18 && $isStudent) {echo "You …...
深入解析CPU工作原理与细节
计算机是现代社会中不可或缺的工具,而CPU(中央处理器)则是计算机的核心组件。CPU负责执行指令和控制计算机的各种操作,它的性能直接影响着计算机的速度和效率。 1. CPU的基本结构 CPU通常由以下几个主要组成部分构成:…...
计算机网络(超详解!) 第二节 物理层(上)
1.物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 物理层的作用是要尽可能地屏蔽掉不同传输媒体和通信手段的差异。 用于物理层的协议也常称为物理层规程(procedure)。 2.物理层的主要任务 主要…...
c++ 打怪升级
内联函数 调用时,直接会把代码拷贝到调用处; 函数指针 可以类比数组 //内联函数 调用时直接将代码拷贝过来 inline const string& longerStr(const string &s1,const string & s2){return s1.size()>s2.size() ? s1:s2; }int main(i…...
代码随想录第十三天(一刷C语言)|翻转二叉树对称二叉树
创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、翻转二叉树 ledcode题目:https://leetcode.cn/problems/invert-binary-tree/ AC代码: /*** Definition for a binary tree node.* struct TreeNode {* int …...
Temu已成拼多多第二曲线
11月28日,拼多多公布最新一季业绩报告。三季度,该集团实现营收688.4亿元,同比增长93.9%;实现美国通用会计准则口径净利润155.4亿元,净利润率为22.6%。相比市场此前预测的营收537.7亿元、经调整净利润129.74亿元&#x…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
