1.Web与Gin基础
1.Web与Gin基础
1.1 Web基础
Web是基于互联网的信息系统,允许用户通过浏览器访问、浏览和分享内容。它也是互联网的一部分,通过使用HTTP协议或HTTPS来实现。
1.1.1 Web 原理简介
用户打开浏览器,输入网址(URL)并访问后,浏览器中就会显示相应的内容,基本流程如下所示:

1.1.2 HTTP简介
HTTP(Hyper Text Transfer Protocol,超文本传输协议),是一种无状态且由文本构成的一种基于请求-响应模型的协议,工作在应用层。
HTTP使用客户端-服务端架构。在日常使用中,浏览器充当客户端,主要与网站服务器进行通信。在HTTP传输过程中,客户端总是通过建立一个连接,再发送一个HTTP请求。服务器不能主动与客户端联系,客户端和服务端都可以提前中断一个连接。如下所示:

HTTP是无状态的,同一个客户端的某次请求和上次请求是没有对应关系的,HTTP服务器端也并不知道这两次请求是否来自于同一客户端。为解决这个问题,Web程序引入Cookie来维护连接的可持续性状态。
1.1.2.1 URI/URL/URN
- URI(Uniform Resouce Identifier,统一资源标识符):用来标识资源身份
- URL(Uniform Resouce Locator,统一资源定位符):URI的一种,用于描述资源的位置和访问方式
- URN(Uniform Resouce Name,统一资源名):URI的一种,用于描述资源的名称,但不指明其位置
通过URL告诉我们资源在哪里,URN告诉我们资源是什么
1.URI
URI表示的是Web上一种可用的资源。文档、图片、视频等,都是由一个URI来标识。URI通常由三部分组成:
- 资源的访问机制
- 存放资源的主机名
- 资源自身的名称
例如:https://www.surpass.net/user/userinfo.html,则可以这样理解
- 这是一个可以通过https来访问的资源
- 资源的位置在 www.surpass.net上面
- 通过/user/userinfo.html可以对该资源进行唯一标识
2.URL
URL用于描述网络上的资源。URL是URI的一个子集,是URI概念的一种实现方式。通俗来讲,URL是互联网上描述资源的字符串,主要用在客户端和服务端程序上面。URL使用一种统一的格式来描述各种资源,包含文件、服务器地址和目录等,格式一般如下所示:
scheme://[username:][passwd@]host[:port]/path/...[?query][#anchor]
其中[]中的内容可以省略
3.URN
URN是带有名称的网络资源。其不依赖于资源的物理位置,因此即使资源的位置发生变化,URN仍然可以保持有效。
4.三者关系
通俗来讲,URL和URN是URI的子集。URI属于对URL的更高层次的抽象,是一种字符串文本标准。
1.1.2.2 HTTP请求
HTTP 是一种基于请求-响应协议,协议涉及的所有事情都以一个请求开始。其请求都是由一系列文本组成,如下所示:
- 请求行
- 0个或任意多个请求首部(header)
- 一行空白行
- 可选的报文主体(body)
示例如下所示:
GET /sample.html HTTP/1.1
Host: www.surpassme.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
<空白行>
<请求报文主体>
请求行中第一个单词为请求方法,后面为统一资源标识符(URI:Uniform Resource Identifier)以及所用到的HTTP 版本。
1.1.2.2.1 HTTP请求方法
请求方法是请求行中第一个单词,用以指明客户端想要对资源执行的操作。目前常用的方法如下所示 :
| 方法 | 含义 |
|---|---|
| GET | 从服务器返回指定资源 |
| HEAD | 与GET类似,但仅用于在不获取报文主体的情况下,获取响应的首部 |
| POST | 将报文主体的数据传递给URI指定的资源 |
| PUT | 将报文主体的数据传递至URI指定的资源,若指定的数据已经存在,则进行更新替换,若不存在,则进行创建 |
| DELETE | 删除服务器上URI指定的资源 |
| TRACE | 返回请求本身,通过该方法,客户端可以知道在它和服务器之间的其他服务器是如何处理请求的 |
| OPTIONS | 获取服务器支持的HTTP方法列表 |
| CONNECT | 用于服务器与客户端建立网络连接,常用于设置SSL隧道以开启HTTPS功能 |
| PATCH | 使用报文主体中的数据对URI指定的资源进行修改 |
1.1.2.2.2 HTTP请求首部
HTTP 请求方法定义了客户端想要执行的动作,请求首部则记录了与请求本身相关的客户端相关信息。请求的首部由任意多个使用冒号分隔的纯文本键值对组成,最后以回车(CR)和换行(LF)结尾。
大多数HTTP请求首部都是可选的,而Host首部是HTTP 1.1 唯一强制要求的首部。根据请求方法的不同,若请求的报文中包含有可选的主体,那么请求的首部还需要携带Content-Length和Transfer-Encoding字段。
常见的首部如下所示:
| 首部字段 | 作用 |
|---|---|
| Accept | 客户端在HTTP响应中能够接收处理的内容类型 |
| Accept-Charset | 客户端希望服务器使用的字符集编码 |
| Authorization | 用于向服务器发送基本的身份验证证书 |
| Cookie | 客户端需要在首部中把服务器之前设置的cookie回传给服务器 |
| Content-Length | 请求主体的字节长度 |
| Content-Type | 当请求报文中包含主体时,用于记录主体内容类型 |
| Host | 请求服务器的地址和端口号 |
| Referer | 发起请求时,页面所在的地址 |
| User-Agent | 发起请求时的客户端描述信息 |
1.1.2.3 HTTP响应
HTTP响应报文是对HTTP请求报文的回复。与HTTP请求一样,也是由一系列文本行组成,如下所示:
- 一个状态行
- 0个或任意数量的响应首部
- 一行空白行
- 可选的报文主体
示例如下所示:
HTTP/1.1 200 OK
Date: Sat, 12 Oct 2024 04:06:59 GMT
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
<空白行>
<响应报文主体>
HTTP响应的第一行为状态行,包含一个状态码和相应的原因短语。
1.1.2.3.1 HTTP响应状态码
HTTP响应中状态码表明了响应类型,其常见的状态码如下所示:
| 状态码 | 类别 | 作用 |
|---|---|---|
| 1XX | 信息状态码 | 服务器通过该状态码告知客户端,已经成功接收到请求,正在处理中 |
| 2XX | 成功状态码 | 服务器通过该状态码告知客户端,已经成功接收到请求,已经处理完成 |
| 3XX | 重定向状态码 | 服务器通过该状态码告知客户端,已经成功接收到请求,但还需要一些附加操作以完成请求 |
| 4XX | 客户端错误码 | 服务器通过该状态码告知客户端,已经成功接收到请求,但服务器无法处理该请求 |
| 5XX | 服务端错误码 | 服务器通过该状态码告知客户端,已经成功接收到请求,但服务器处理出错 |
1.1.2.3.2 HTTP响应首部
响应首部与请求首部一样,都是由冒号分隔的纯文本键值对,并且同样以回车(CR)和换行(LF)结尾。通过响应首部向客户端传达更多与响应相关和服务器的相关信息。常见的响应首部如下所示:
| 首部字段 | 作用 |
|---|---|
| Allow | 服务器支持的哪些方法 |
| Content-Length | 响应主体的字节长度 |
| Content-Type | 当响应报文中包含主体时,用于记录主体内容类型 |
| Date | 以GMT格式记录当前时间 |
| Location | 仅在重定向时使用,告知客户端接下来应该向哪个URL发起请求 |
| Server | 返回响应服务器的域名 |
| Set-Cookie | 在客户端设置Cookie,一个响应里面可以包含多个Set-Cookie首部 |
| WWW-Authenticate | 服务器通过这个首部告知客户端,在Authorization请求首部中应该提供哪种类型的身份验证信息 |
1.1.2.4 HTTP 2 简介
HTTP自创建以来经历了多个版本的发展,分别是HTTP 0.9、HTTP 1.0、HTTP 1.1、HTTP 2、HTTP 3。目前使用最多的是HTTP 1.1 和 HTTP 2。
HTTP 2 优化了性能、而且兼容HTTP 1.1的语义,但也与HTTP 1.1 有一些区别。比如,它不是文本协议,而是二进制协议,而且HTTP头部信息使用HPACK进行压缩,支持多路复用、服务器推送等功能。
相比于HTTP 1.1,HTTP 2新增了头部信息压缩及推送功能,提高了传输效率。
- 头部信息压缩:在HTTP 1.1 中,每次发送请求和返回响应,HTTP头部信息都必须是完整,且头部信息中有很多内容,都是以字符串形式保存的,这样会占用较大的带宽。HTTP 2 对头部信息进行压缩,可以有效减少占用带宽。
- 推送功能:在HTTP 2 之前,只能是客户端发送请求,服务端返回响应。客户端是主动方,服务端永远是被动方。而在HTTP 2中有了的推送功能,即服务端可以主动向客户端发送一些请求。

1.1.3 Web 程序组成
Web 程序是通过调用解释引擎来处理动态内容的。而解释器引擎是一种用于执行源码或脚本的计算机程序,它逐行读取和分析代码,并即时执行其中的指令,而不是将整体代码先编译成机器语言再运行。解释引擎通常由 处理器(handler) 和 模板引擎(Template Engine) 组成,其中处理器负责接收来自客户端的HTTP请求执行逻辑,模板引擎负责生成动态网页内容,如下所示:

1.1.3.1 处理器
在Web程序中,处理器是核心组件,负责接收和处理客户端发来的HTTP请求。通常,处理器会先解析请求的路由(Route),将URL映射到相应的控制器(Controller),控制器根据请求,可能会访问模型(Model)来获取或修改数据,然后调用模板引擎生成相应的视图(View)。最后处理器将生成的视图通过HTTP响应返回给客户端。这种模型属于MVC模型,各个功能如下所示:
- 模型负责处理与业务逻辑相关的数据,并可直接访问数据库
- 视图负责展示数据,一般不包含业务逻辑,仅用于呈现内容
- 控制器负责协调模型与视图,处理用户请求并更新数据或显示相应的页面
三者关系如下所示:

MVC模型是一种长期编程经验的总结,并不是唯一的模型,实践中采用什么模型,需要根据具体的场景来决定。
1.1.3.2 模板引擎
模板引擎是为了使用户界面和业务数据分离而产生的。它可以生成特定格式的文档,以便将模板(template)和数据(data)组合在一超,最终生成HTML文档。

模板引擎有多种类型,最简单的为置换型模板引擎。这种模板引擎通过将模板中的特定标记替换为实际数据,生成最终内容。虽然实现起来非常简单,但效率较低,难以满足高流量的网站需求。
为提高性能,后续还出现了解释型和编译型的模板引擎。这些模板引擎不仅能更高效的生成内容,还能支持更复杂的逻辑和功能。模板引擎的主要优势在于将网站的界面与数据、业务代码和逻辑代码分离。大大提高了开发效率。它使得代码的复用更容易。同时将前端页面与业务逻辑分离,便于代码的维护、阅读。
1.2 Gin
1.2.1 Gin简介
Gin是Go语言中一个Web框架,轻量、快速且易于使用。通过其提供的库和工具,可以快速构建Web程序。Gin官网地址:https://gin-gonic.com/

1.2.2 Gin库和工具
Gin是基于Go语言标准库构建的Web框架,提供了一系列额外的库和工具,使开发Web程序和API更加方便。常见的Gin库和工具如下所示:
- gin-gonic/gin:提供核心功能,如路由管理、中间件和请求处理,是构建Web程序和API的基础
- gin-gonic/contrib/cache:用于缓存Gin路由响应的库,可提升性能
- gin-gonic/gin-testutil:Gin测试工具,方便编写单元测试
- gin-gonic/gin-jwt:用于支持JWT(JSON Web Token)身份验证的中间件库
- swaggo/gin-swagger:能够根据OpenAPI规范自动生成API文档
- gin-contrib:附加中间件和实用工具的集合,支持身份验证、速率限制和跨域(CORS)等功能
1.2.3 Gin优势
使用Gin进行 Web 开发的优势如下所示:
- 快速:Gin是专为高性能而设计,专注于提升开发速度和使用最少的内存空间
- 轻量级:不会给开发者的程序增加不必要的开销,使其易于开发和部署
- 易于使用:具有最简单直观的API,更易于使用
- 灵活性强:可以轻松地进行自定义以满足特定的需求,例如添加中间件,使用不同的路由等
- 社区活跃:社区提供资源,以帮助开发者构建更好的Web程序
1.2.4 Gin架构
Gin 将程序分为三个相互关联的组件:模型、视图和控制器。
- 模型:负责程序的数据传输和业务逻辑。在Gin中,模型通常由结构体或接口表示,用于处理数据存储等操作
- 视图:负责展示用户界面或呈现数据。在Gin,视图通过HTML模板或其他模板引擎生成,向用户展示结果
- 控制器:负责处理用户请求,与模型交互并生成响应。在Gin,控制器通常是路由处理程序,定义如何根据用户请求执行相应的操作并返回结果。
HTTP服务器监听传入的请求并将它们传递给路由器,路由器将每个请求映射到适当的请求处理程序,请求处理程序处理请求,与模型交互、并生成响应。
1.2.5 示例
Gin安装命令如下所示:
go get -u github.com/gin-gonic/gin
示例代码如下所示:
package main
import "github.com/gin-gonic/gin"
func hello(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello world",
})
}
func main() {
r := gin.Default()
r.GET("/hello", hello)
// 默认监听0.0.0.0:8080
r.Run()
}
在浏览器中访问地址 http://127.0.0.1:8080/hello ,返回结果如下所示:

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

作者: Surpassme
来源: http://www.jianshu.com/u/28161b7c9995/
http://www.cnblogs.com/surpassme/
声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 ,否则保留追究法律责任的权利。如有问题,可发送邮件 联系。让我们尊重原创者版权,共同营造良好的IT朋友圈。

浙公网安备 33010602011771号