从零开始学Go web——第一天
文章目录
- 从零开始学Go web——第一天
- 一、Go与web应用简介
- 1.1 Go的可扩展性
- 1.2 Go的模块化
- 1.3 Go的可维护
- 1.4 Go的高性能
- 二、web应用
- 2.1 工作原理
- 2.2 各个组成部分
- 2.2.1 处理器
- 2.2.2 模板引擎
- 三、HTTP简介
- 四、HTTP请求
- 4.1 请求的文本数据
- 4.2 请求方法
- 4.2.1 请求方法类型
- 4.2.2 安全的请求方法
- 4.2.2 幂等的请求方法
- 4.2.2 浏览器对请求方法的支持
- 4.3 请求首部
- 五、HTTP响应
- 5.1 响应状态码
- 5.2 响应首部
- 5.3 URI
- 六、HTTP/2
从零开始学Go web——第一天
“工欲善其事必先利其器”!学习web的第一天,当然是要学习与web息息相关的就是HTTP协议等知识点,因此第一天让我们一起聊聊Go与web的关系、web应用、HTTP的简介/请求/响应以及HTTP2协议, 开启快乐学习Go web!
一、Go与web应用简介
Go语言是一门函数式和过程式并存语言,并且提供了现代化包管理系统、垃圾收集机制、以及各种功能强大的标准库。
而web应用具备的四个条件:
- 可扩展的:简单、快速地提升应用的性能以便处理更多的请求。比如管理者可以通过添加硬件来提升请求处理能力
- 模块化:大规模的web应用应该由可替换的组件构成,使得可以快速添加、移除、修改,以便更好地复用。
- 可维护
- 高性能
1.1 Go的可扩展性
Go语言的扩展包括两个方面:
- 水平扩展: Go语言可以编译为不包含动态依赖关系的静态二进制文件,从而可以在没有安装Go语言的系统里面部署Go web应用。
- 垂直扩展: Go web应用只需要一个操作系统线程,就可以高效运行数十万个goroutine。
1.2 Go的模块化
Go语言的模块化包括以下两个方面:
-
Go语言的接口。接口可以实现动态类型匹配机制,其中Go语言的函数可以接受接口作为参数,用户只需要实现了接口的方法,就可以将接口作为参数传递给函数,实现动态类型传参。同时,Go语言也实现了一个空接口,可以把任何类型的值作为函数的实际参数。
-
创建微服务。创建多个规模较小的Go服务(也就是一个个Go包)并且将它们组合为当个web应用。
1.3 Go的可维护
- gofmt格式化源代码
- godoc对go源代码以及注释进行语法分析,并且使用html、纯文本或者其他多种格式生成文档。
- gotest自动寻找与源代码位于同一个包的测试代码,并进行功能测试和性能测试。同时也提供了web测试工具,如httptest。
1.4 Go的高性能
- Go程序会编译为本地码,比一般的解释型语言要更加快
- Go的goroutine对并发编程有了更好的支持。
二、web应用
2.1 工作原理
web服务器:对客户端发送的HTTP请求做出响应,并且将响应HTTP返回给客户端。一个web服务器就是一个web应用。
web应用:对请求进行处理,然后执行应用程序中预先设定好的操作。
因此,web服务器是一种特殊的web应用,只会返回请求的文件。若我们要想构建一个web应用,必须符合以下两个条件:
-
必须向发送命名请求的客户端返回HTML,而客户端会展示渲染后的HTML
-
在向客户端传输数据的时候必须使用HTTP协议。
2.2 各个组成部分
web应用主要包括如下三部分:
- HTTP请求报文获取客户端输入
- 处理请求报文
- 生成HTML,并且以HTTP响应报文的形式返回给客户端。
为了完成这些步骤,web应用被分为处理器(handler)和模板引擎(template engine)两个部分。
2.2.1 处理器
接收和处理客户端请求,调用模板引擎生成HTML并且将数据填充至响应报文中。
2.2.2 模板引擎
通过模板和数据生成最终的HTML,分为静态模板和动态模板:
- 静态模板:夹杂着占位符的HTML。将占位符替换为对应数据来生成最终的HTML,不包含或者只包含少量的逻辑代码,也称为无逻辑模板。
- 动态模板:包含HTML、占位符、编程语言结构,如条件语句、变量等。如JSP、ASP等及时动态模板引擎。
三、HTTP简介
HTTP是万维网的应用层通信协议。目前总共有两个版本:HTTP1.1和HTTP2.0(又称为HTTP/2),目前使用最广泛的还是HTTP1.1。
那么什么是HTTP呢?HTTP是一种无状态、由文本构成的请求-响应协议,使用的是客户端-服务器的计算模型。
-
无状态:只知道当前的请求和响应,后续的请求对之前的请求一无所知。
-
请求和响应:发送端发送请求给接收端,接收端响应数据给发送端。
-
客户端-服务端:客户端称为客户代理,服务端为客户端提供服务。
四、HTTP请求
4.1 请求的文本数据
HTTP请求的数据也称为HTTP请求报文,主要有以下四部分组成:
- 请求行(request-line)
- 请求首部(header,零个或者多个)
- 空行(一个)
- 报文主体(body,可选)
典型的HTTP请求报文如下所示:
GET / HTTP/1.1 # GET代表的是请求方法(request method),之后跟的是URI,以及所用的HTTP版本
Host: 127.0.0.1:8083 # 请求首部
User-Agent: curl/7.58.0 # 请求首部
Accept: */* # 请求首部
(空行) # 空行,必须存在
注: #后添加的是注释
4.2 请求方法
4.2.1 请求方法类型
请求方法表明了客户端想要对资源执行的操作。HTTP1.1具有GET、PUT、DELETE、OPTIONS、TRACE、CONNECT这六个方法。HTTP1.1只需要实现GET方法和HEAD方法,其它方法都是可选的。
-
GET:命令服务器返回指定的资源
-
HEAD:不要求服务器返回报文的主体。通常应用于只需要获取响应首部。
-
POST: 报文主体数据传递给URI指定资源,数据做啥由服务器本身决定。
-
PUT: 报文主体数据设置为URI指定资源,若URI指定位置有数据则进行替换,否则在URI指定位置上新建一个资源
-
DELETE:删除服务器指定URI资源
-
TRACE: 返回请求本身。
-
OPTIONS: 返回它支持的HTTP方法列表
-
CONNECT: 客户端和服务器建立网络连接。通过用于设置SSL隧道以开启HTTPS功能
-
PATCH: 使用报文主体中的数据对指定URI资源进行修改
4.2.2 安全的请求方法
不会对服务器状态进行修改。GET、HEAD、OPTIONS、TRACE是安全的请求方法
4.2.2 幂等的请求方法
第二次调用,不会对服务器状态进行改变。安全的请求方法是幂等的,此外PUT和DELETE也是幂等的。
4.2.2 浏览器对请求方法的支持
GET是所有浏览器支持的。
对于传输的数据来说,HTML不支持除了GET和POST之外其他HTTP请求方法。但是用户可以通过XHR来获取PUT和DELETE的支持,该技术可以实现XML、JSON、纯文本等任何格式的请求和响应。
4.3 请求首部
记录了与请求本身以及客户端相关的信息。由任意多个冒号分隔的纯文本键值对组成,以回车和换行结尾。
注:Host首部字段是HTTP1.1强制要求的首部,其余的都是可选的。
若请求报文中包含了请求主题,那么请求首部需要携带内容长度(Content-Length)或者传输编码(Transfer-Encoding)字段。
五、HTTP响应
HTTP响应报文是对HTTP请求报文的回复,主要有以下四部分组成:
- 状态行(一个)
- 响应首部(header,零个或者多个)
- 空行(一个)
- 报文主体(body,可选)
典型的HTTP响应报文如下所示:
HTTP/1.1 200 OK # 状态行,包含HTTP协议类型,状态码(status code)和相应的原因短语(reason phrase)
Content-Type: text/plain; charset=utf-8 # 响应首部
Date: Mon, 27 Nov 2023 08:21:42 GMT # 响应首部
Content-Length: 12 # 响应首部
(空行)
Hello World! # 报文主体
5.1 响应状态码
HTTP响应类型总共有5种,分别以不同的数字作为前缀:
5.2 响应首部
格式和请求首部一样。为客户端提供更多与请求相关或者与客户端诉求相关的信息。常用的响应首部如下所示:
5.3 URI
统一资源标识符(Uniform Resource Identifier,URI),使用位置字符串表示互联网资源。字符串表示资源名称:URN,字符串表示资源路径:URI。URL是一个涵盖的术语,包含了URI和URN。
URI的一般格式:
<方案名称>:<分层部分>[?<查询参数>][#片段]
注:只有方案名称和分层部分是必须的,其它是可选的。
-
方案名称(scheme name):记录了URI使用的方案,定义了URI其余部分结构。URI具有大量的方案,在HTTP中使用的是HTTP方案。
-
分层部分(hierarchical part):包含了资源的识别信息。若以//开头,则包含了可选的用户信息(以@结尾)。在用户信息(可选的)后面跟着的是分层路径,该路径由分段组成,各个分段之间由/分隔。
-
查询参数:由一连串的键值对构成,它们之间由&分隔
-
片段:由#为前缀,对URI定义的次级资源进行标识。
由于URI的片段是由客户端处理的,而web浏览器在将URI发送给服务器之前,会将片段移除,若想要获取片段的信息,则需要使用JS或者某个HTTP客户端库,将URI片段包含在GET请求里面。
HTTP URI方案示例:
http://pzs:password@www.example.com/docs/file?name=pzs&location=china#summy # http代表方案。@之前分段记录了用户名和密码,而之后的www.example.com/docs/file记录的是分层部分的其余部分,其中最高层为www.example.com,后面的两个层为doc何file,每个分层由/分隔。?之后是查询参数,最后有一个#结尾的片段。
Tips: 每个URL是一个独立字符串,不能使用空格。同时#和?有特殊意义,不能用于其它用途。若想要避开这些限制,则必须使用URL编码来将特殊符号进行转换。示例如下所示:
http://pzs@www.example.com/docs/file?name=p zs&location=china#summy
经过转换后为:
http://pzs@www.example.com/docs/file?name=p%20zs&location=china#summy #空格的ASCII码为20,然后在前面再加上一个%形成URL编码
六、HTTP/2
一种二进制通信协议,使得语法分析更加高效、紧凑、健壮。当然这样的话就无法使用telnet程序进行调试了。
HTTP2是多路复用的,多个请求和响应可以同时使用一个连接。而HTTP1.1只能一个请求和响应对应一个连接。
HTTP2允许对首部进行压缩,减少数据传输量,并且允许服务器将响应推送给客户端。
在新版本的Go语言中使用HTTPS则默认使用HTTP2协议
好啦,第一天的web学习到此就结束喽!第二天让我们一起来写属于自己的第一个Go web程序!
相关文章:

从零开始学Go web——第一天
文章目录 从零开始学Go web——第一天一、Go与web应用简介1.1 Go的可扩展性1.2 Go的模块化1.3 Go的可维护1.4 Go的高性能 二、web应用2.1 工作原理2.2 各个组成部分2.2.1 处理器2.2.2 模板引擎 三、HTTP简介四、HTTP请求4.1 请求的文本数据4.2 请求方法4.2.1 请求方法类型4.2.2…...

6.Eclipse里下载Subclipse插件
方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Marketplace --> 在Find中输入subclipse搜索 --> 找到subclipse点击install 方法二:从Install New Software里下载 具体操作:打开…...

家用洗地机哪个品牌最好最实用?热门洗地机测评
随着社会的不断进步,我们逐渐意识到日常生活中的许多任务需要消耗大量的时间和体力。一个典型的例子是卫生清洁工作,尤其是在大面积地区,如大型建筑物、商场或工厂。这些任务不仅繁琐,还可能影响生活质量和工作效率。为了应对这一…...

【C语言:自定义类型(结构体、位段、共用体、枚举)】
文章目录 1.结构体1.1什么是结构体1.2结构体类型声明1.3结构体变量的定义和初始化1.4结构体的访问 2.结构体对齐2.1如何对齐2.2为什么存在内存对齐? 3.结构体实现位段3.1什么是位段3.2位段的内存分配3.3位段的跨平台问题3.4位段的应用3.5位段使用注意事项 4.联合体4…...
【1day】华天软件 OAworkFlowService接口SQL注入漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...

Oracle(2-11)RMAN Backups
文章目录 一、基础知识1、RMAN Backup Concepts RMAN备份概念2、RMAN Backup Modes RMAN备份的类型3、Backup File Types 备份文件类型4、RMAN Backup Destinations RMAN备份目标5、Backup Constraints 备份约束6、Recovery Manager Backups 恢复管理器备份7、Characteristics …...
使用docker搭建『Gitea』私有仓库
文章目录 一、安装 docker 环境1、移除以前的 docker 相关包2、配置yum源3、安装 docker4、启动 docker 二、安装 docker compose1、安装docker compose2、赋予下载的docker-compose执行权限 三、安装 gitea1. 创建工作目录2. 创建 Docker Compose 文件3. 启动 Gitea4. 访问 Gi…...

CopyOnWriteArrayList怎么用
什么是CopyOnWriteArrayListCopyOnWriteArrayList常用方法CopyOnWriteArrayList源码详解CopyOnWriteArrayList使用注意点CopyOnWriteArrayList存在的性能问题CopyOnWriteArrayList 使用实例基本应用实例并发应用实例 拓展写时复制 什么是CopyOnWriteArrayList CopyOnWriteArra…...

旋转设备状态监测与预测性维护:提高设备可靠性的关键
在工业领域的各个行业中,旋转设备都扮演着重要的角色。为了确保设备的可靠运行和预防潜在的故障,旋转设备状态监测及预测性维护变得至关重要。本文将介绍一些常见的旋转设备状态监测方法,并探讨如何利用这些方法来实施预测性维护,…...

类和对象——(7)this指针
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 人生就像骑单车,想保持平衡…...
回溯算法题型分类
题型一:排列、组合、子集相关问题 提示:这部分练习可以帮助我们熟悉「回溯算法」的一些概念和通用的解题思路。解题的步骤是:先画图,再编码。去思考可以剪枝的条件, 为什么有的时候用 used 数组,有的时候设…...
ApplicationRunner 类
优质博文:IT-BLOG-CN 在开发中可能会有这样的情景。需要在容器启动的时候执行一些内容。比如读取配置文件,数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。这两个接口分别为CommandLineRunner和ApplicationRunner。他们的执…...

QT中的 容器(container)-大全
一、介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项。比如,你需要一个大小可变的QString的数组,则使用QVector<QString>。 这些容器类比STL(C标准模板库)容器设计得更轻量、更安全并…...
Docker配置镜像加速器
Ubuntu 安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 sudo mkdir -p /etc/docker sudo t…...

飞致云1panel + 雷池WAF
可能有许多人都有这个需求:为自己的个人站点套上WAF,增加安全性,本文将介绍如何将1panel面板深度结合长亭雷池防火墙,实现为个人站点套上WAF并且自动续签ssl证书。 前提条件: 服务器IP已绑定域名 完整的1panel环境 …...

策略梯度简明教程
策略梯度方法 (PG:Policy Gradient) 是强化学习 (RL:Reinforcement Learning) 中常用的算法。 1、从库里的本能开始 PG的原理很简单:我们观察,然后行动。人类根据观察采取行动。 引用斯蒂芬库里的一句话: 你必须依靠…...
鸿蒙原生应用/元服务开发-利用picker选择器来多选相册图片
前言 在之前的时候,测试一个应用进入相册选择图片demo,利用了startAbilityForResult()方法,启动相对应的Ability来完成效果,但是这种方法有限制,一次只能获取一张图片,在完成某些功能测试的时候就很不方便。…...

java:封装统一的响应体code、data、msg、paging
背景 我们在写接口的时候一般不会直接返回给前端数据,而是会有响应体,比如 code、data、msg,这样就有一个统一的结构方便前端处理,那么今天就来封装一个统一的响应体 封装基本响应体 1、在 config 包里新建 ApiResponse.java …...

leetcode算法之栈
目录 1.删除字符串中的所有相邻重复项2.比较含退格的字符串3.基本计算器II4.字符串解码5.验证栈序列 1.删除字符串中的所有相邻重复项 删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {string ret;//使用数组模拟栈操作for(auto …...

电脑上mp4视频文件无缩略图怎么办
前言:有时候电脑重装后电脑上的mp4视频文件无缩略图,视频文件数量比较多的时候查找比较麻烦 以下方法亲测有效: 1、下载MediaPreview软件 2、软件链接地址:https://pan.baidu.com/s/1bzVJpmcHyGxXNjnzltojtQ?pwdpma0 提取码&…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...