1.Web与Gin基础

1.Web与Gin基础

1.1 Web基础

    Web是基于互联网的信息系统,允许用户通过浏览器访问、浏览和分享内容。它也是互联网的一部分,通过使用HTTP协议或HTTPS来实现。

1.1.1 Web 原理简介

    用户打开浏览器,输入网址(URL)并访问后,浏览器中就会显示相应的内容,基本流程如下所示:

0101-Web基本工作原理.png

1.1.2 HTTP简介

    HTTP(Hyper Text Transfer Protocol,超文本传输协议),是一种无状态且由文本构成的一种基于请求-响应模型的协议,工作在应用层

    HTTP使用客户端-服务端架构。在日常使用中,浏览器充当客户端,主要与网站服务器进行通信。在HTTP传输过程中,客户端总是通过建立一个连接,再发送一个HTTP请求。服务器不能主动与客户端联系,客户端和服务端都可以提前中断一个连接。如下所示:

0102-HTTP请求响应示意图.png

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中有了的推送功能,即服务端可以主动向客户端发送一些请求。

0103-HTTP2新增功能.png

1.1.3 Web 程序组成

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

0104-处理器和模板引擎.png

1.1.3.1 处理器

    在Web程序中,处理器是核心组件,负责接收和处理客户端发来的HTTP请求。通常,处理器会先解析请求的路由(Route),将URL映射到相应的控制器(Controller),控制器根据请求,可能会访问模型(Model)来获取或修改数据,然后调用模板引擎生成相应的视图(View)。最后处理器将生成的视图通过HTTP响应返回给客户端。这种模型属于MVC模型,各个功能如下所示:

  • 模型负责处理与业务逻辑相关的数据,并可直接访问数据库
  • 视图负责展示数据,一般不包含业务逻辑,仅用于呈现内容
  • 控制器负责协调模型与视图,处理用户请求并更新数据或显示相应的页面

    三者关系如下所示:

0105-MVC模型.png

MVC模型是一种长期编程经验的总结,并不是唯一的模型,实践中采用什么模型,需要根据具体的场景来决定。

1.1.3.2 模板引擎

    模板引擎是为了使用户界面和业务数据分离而产生的。它可以生成特定格式的文档,以便将模板(template)和数据(data)组合在一超,最终生成HTML文档。

0106-模板引擎.png

    模板引擎有多种类型,最简单的为置换型模板引擎。这种模板引擎通过将模板中的特定标记替换为实际数据,生成最终内容。虽然实现起来非常简单,但效率较低,难以满足高流量的网站需求。

    为提高性能,后续还出现了解释型编译型的模板引擎。这些模板引擎不仅能更高效的生成内容,还能支持更复杂的逻辑和功能。模板引擎的主要优势在于将网站的界面与数据、业务代码和逻辑代码分离。大大提高了开发效率。它使得代码的复用更容易。同时将前端页面与业务逻辑分离,便于代码的维护、阅读。

1.2 Gin

1.2.1 Gin简介

    Gin是Go语言中一个Web框架,轻量、快速且易于使用。通过其提供的库和工具,可以快速构建Web程序。Gin官网地址:https://gin-gonic.com/

0107-Gin特点.png

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 ,返回结果如下所示:

0108-首个Gin示例.png

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

posted @ 2025-11-17 00:32  Surpassme  阅读(15)  评论(0)    收藏  举报