从零开始学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 提取码&…...
【Centos8】配置网络镜像源
文章目录 配置 yum 源配置网络 yum 源备份下载阿里 centos-base.repo 到 /etc/yum.repos.d/安装 EPEL 源测试安装 配置 yum 源 # 检查是否安装了 yum rpm -qa|grep yum# 查看本地已安装的所有软件包 yum list installed# 查看软件包安装位置 # 查看某个东西的软件包 rpm -qa|g…...
深入学习Synchronized各种使用方法
文章目录 前言一、synchronized关键字通用在下面四个地方:1.1synchronized修饰实例方法1.2synchronized修饰静态方法:1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3…...
【idea】设置鼠标滚轮控制缩放大小
1、点击file 选择Setting 2、点击Editor 下面的 General 3、勾选 Mouse Control 下面的 Change font size with CtrlMouse Wheel in 4、点级apply 5、按 ctrl键 鼠标滚轮缩放字体的大小...
合并两个有序数组(leetcode_刷题1)
目录 题目:合并两个有序数组 题目分析方向1: 题目分析方向2: 题目:合并两个有序数组 题目要求: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums…...
麒麟linux将图片批量生成PDF的方法
笔者手里有一批国产linu系统,目前开始用在日常的工作生产环境中,我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux,统信UOS等,基本都是基于debian再开发的linux。 问题描述: wind…...
Linux——vim编辑文件时——.swp文件解决方案
test.cpp样例 当我们vim test.cpp进入编辑文件。 却忘记了保存退出 再次进入就会出现一下画面 当你摁下Enter键位 出现以下几个选项 O——是只读不写 E——是正常打开文件但不会载入磁盘内容 R——覆盖——是加载存储磁盘的文件(当我们忘记保存时,系统会自动帮我…...
【Maven】清理 maven 仓库
初始情况下,我们的本地仓库是没有任何jar包的,此时会从私服去下载(如果没有配置,就直接从中央仓库去下载)。 可能由于网络的原因,jar包下载不完全,这些不完整的jar包都是以lastUpdated结尾。此…...
APOLLO自动驾驶技术沙龙:未来已来,共创智能交通新时代
在这次Apollo会议上,我深刻地感受到了人工智能自动驾驶技术领域的最新进展和未来趋势。作为一名从事软件开发工作的人员,我深感荣幸能够参加这次盛会。 前言 本次活动是百度Apollo社区工程师齐聚首钢Park,带来现场实操与技术分享。主要围绕Ap…...
Java面试题12
1.redis 怎么实现分布式锁? Redis可以通过以下方式实现分布式锁: 使用RedLock算法:多个Redis节点组合使用,通过竞争锁来达到分布式锁的效果。使用SETNX命令:利用SETNX(SET if Not eXists)命令…...
ubuntu上创建服务启动python脚本
场景 最近在使用ubuntu服务器部署MySQL和同步数据,同步数据使用的是python,但是我不能直接操作服务器,只能通过Xshell远程访问服务器,但是启动python脚本的时候如果关掉xshell会停止Python脚本,所以如果要让python脚本…...
南宁网站建设企业网站/外链代发
最近在一个J2EE项目的开发过程中,遇到了这样的问题:在服务器上部署好这个Web系统后,这时访问系统是很正常的。当把服务器的时间(例如:2008-03-31)加一天或更多天(例如:2008-04-01,2008-04-02...),这时再访问…...
手机网站开发与pc网站开发的不同/深圳网络推广公司排名
综述 最近已经在做Tornado的项目 Tornado是基于异步IO的 所以理解异步IO十分重要 理解 :)例子来自网络 老张爱喝茶,废话不说,煮开水。 出场人物:老张,水壶两把(普通水壶,简称…...
电子商务网站管理系统/河南品牌网络推广外包
分析FileInputStream,其中finalize()被覆写,优先使用finalize(),close()方法可能内存泄漏,或者手动colse()之前做好检查package java.io;import java.nio.channels.FileChannel;import sun.nio.ch.FileChannelImpl;/*** A FileInputStream ob…...
辽宁省建设工程招标协会网站/广州:推动优化防控措施落地
一些知识点: 要将session进行持久化: 要将cookie进行持久化,则要将cookie中的JSSESSIONID进行持久化。这里要创建一个cookie来覆盖服务器之前自动生成的JSSESSIONID。 这里分为添加进购物车,查看购物车,和前端 前端…...
邯郸网站网站建设/东莞seo网络优化
localStorage 生命周期是永久的 这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。sessionStorage 生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也…...
成都行业网站/怎么创建个人网站
**作者:张华 发表于:2016-12-07 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 )** python3中的默认编码unicode(UCS-2编码)采用2个字节表…...