goweb入门教程

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

关于web:本质

image-20231005163547291

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

image-20231005164154245

一个请求对应一个响应。

一个请求对应一个响应!

一个请求对应一个响应!

一个请求对应一个响应!

image-20231103151829918

路由请求方式: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}}
渲染数组:

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

未完,以后会更新的

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

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

相关文章

11-28渗透

用nmap扫描靶机1进行主机发现 已知靶机1的主机在172.16.17.0/24下 扫描结果如下 根据扫描结果看开启的服务怀疑172.16.17.177是靶机1 浏览器访问172.16.17.177页面得到如下 我们知道织梦cms系统默认管理路径是dede&#xff0c;登陆管理后台可以通过地址172.16.17.177/dede/i…

隐式类型转化

1. 2. 3. 4. 5. 6. 7. 8.

Flutter开发type ‘Future<int>‘ is not a subtype of type ‘int‘ in type cast错误

文章目录 问题描述错误源码 问题分析解决方法修改后的代码 问题描述 今天有个同事调试flutter程序时报错&#xff0c;问我怎么解决&#xff0c;程序运行时报如下错误&#xff1a; type ‘Future’ is not a subtype of type ‘int’ in type cast 错误源码 int order Databas…

PTA-6-48 使用面向对象的思想编写程序描述动物

题目&#xff1a; 使用面向对象的思想编写程序描述动物&#xff0c;说明&#xff1a; &#xff08;1) 分析兔子和青蛙的共性&#xff0c;定义抽象的动物类&#xff0c;拥有一些动物共有的属性&#xff1a;名字、颜色、类别&#xff08;哺乳类、非哺乳类&#xff09;&#xff0c…

20分钟拥有自己的ChatGPT4,高效低成本,小白必看

准备工作 1、准备一个3.5的账号 2、一张虚拟卡 开始步骤 从ChatGPT第一版发布到现在&#xff0c;还不到一年的时间中&#xff0c;可是它使用的GPT架构已经从3.5版本进化到现在的4.0版本&#xff0c;随之而来的是其能力的极大提升。下面是GPT-4在其官网的介绍中的一句话&…

conda环境下 ERROR: CMake must be installed to build dlib问题解决

1 问题描述 pip install -r requirements.txt 在构建video_retalking项目过程中&#xff0c;使用命令安装依赖包时&#xff0c;出现如下错误&#xff1a; Building wheels for collected packages: face-alignment, dlib, ffmpy, futureBuilding wheel for face-alignment …

与中通支付对接

最近项目接入商户&#xff0c;商户需要同步给中通支付&#xff0c;报错两个异常已解决。 一、json报错 未接入中通SKD之前&#xff0c;不会报错&#xff0c;接入后&#xff0c;json转换异常。 排查后发现&#xff0c;中通的jar包里JSON版本太低&#xff0c;与自身项目的版本冲…

不会写代码也能做自动化?推荐一款自动化测试神器

在软件测试这条道路上&#xff0c;大部分的职业技能发展道路都会是纯业务手工测试→自动化测试→性能测试→安全测试/测试开发。 但是却有着一部分人起初进入软件测试这一行看重的就是软件测试属于IT行业&#xff0c;门槛比较低&#xff0c;不需要代码基础。 这就导致了这一部…

0基础学java-day9

一、房屋出租系统-需求&&界面 1项目需求说明 实现基于文本界面的《房屋出租软件》。 能够实现对房屋信息的添加、修改和删除&#xff08;用数组实现&#xff09;&#xff0c;并能够打印房屋明细表 2 房屋出租系统-界面 2.1 项目界面 - 主菜单 2.2项目界面- 新增房…

Linux编写Shell命令脚本

1.编写Shell脚本 可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”&#xff0c;它作为用户与Linux系统内部的通信媒介&#xff0c;除了能够支持各种变量与参数外&#xff0c;还提供了诸如循环、分支等高级编程语言才有的控制结构特性。要想正确使用Shell中的这些功能…

git的创建以及使用

1、上传本地仓库 首先确定项目根目录中没有.git文件&#xff0c;有的话就删了&#xff0c;没有就下一步。在终端中输入git init命令。注意必须是根目录&#xff01; 将代码存到暂存区 将代码保存到本地仓库 2、创建git仓库 仓库名称和路径&#xff08;name&#xff09;随便写…

vscode 里怎么自动提示 webpack 配置项?

webpack 的配置项非常多&#xff0c;容易忘记&#xff0c;能自动提示很有用&#xff0c;就是在配置文件里面添加下面代码 // 下面这行用于 vscode 中智能化自动提示 webpack 配置项 /** type {import(webpack).Configuration} */

文本三剑客之sed

一、sed编辑器 ■ sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的—组规则来编辑数据流 ■ sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么从命令行中输入&#xff0c;要么存储在一个命令文本文件中 1、sed的工作流程主要…

分享一个适用于 Vue3 的好的组件库,PrimeVue组件。

一、PrimeVue介绍 PrimeVue 是一个基于 Vue.js 的 UI 组件库&#xff0c;专注于提供丰富、灵活、现代的 UI 组件&#xff0c;以帮助开发者构建功能强大的 Web 应用程序。PrimeVue 提供了一系列的组件&#xff0c;涵盖了从基本的表单元素到高级的数据表格和图表等各种组件。 二、…

大模型fine-tune 微调

大模型的 Fine-tune 我们对技术的理解&#xff0c;要比技术本身更加重要。 正如我在《大模型时代的应用创新范式》一文中所说&#xff0c;大模型会成为AI时代的一项基础设施。 作为像水、电一样的基础设施&#xff0c;预训练大模型这样的艰巨任务&#xff0c;只会有少数技术…

测试用例设计全网最强篇(建议收藏)

本篇从多角度带大家从0开始学习怎么写测试用例&#xff0c;七种方法8个案例&#xff08;含用例模板&#xff09;&#xff1b;学习目标&#xff1a;测试用例的基本知识以及黑盒测试用例的设计方法。 前言&#xff1a;总体编写策略&#xff1a; 对于测试用例编写来说&#xff0…

只会在终端使用Python运行代码?这些高级用法了解了解

大部分同学在终端使用Python可能只是简单的执行代码&#xff0c;但其实结合一些Python内置模块或第三方库可以实现更高级且便捷的用法&#xff0c;一起看看吧 插播&#xff0c;更多文字总结指南实用工具科技前沿动态第一时间更新在公粽号【啥都会一点的研究生】 代码Benchmar…

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

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

第一百八十三回 如何给图片添加阴影

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"自定义可以滑动的刻度尺"样相关的内容&#xff0c;本章回中将介绍" 如何给图片添加阴影".闲话休提&#xff0c;让…

Windows环境下的JDK安装与环境配置

一、JDK下载 1、打开Oracle官方网站下载页 Java Downloads | Oracle 中国 2、选择Java archive页&#xff0c;在版本列表中选择需要下载的版本 3、选择系统环境对应的版本&#xff0c;点击对应的下载按钮&#xff0c;弹出技术许可勾选框 4、勾选Oracle技术许可协议 5、输入Or…