从零开始学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程序!

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

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

相关文章

聊聊如何进行代码混淆加固

​ 聊聊如何进行代码混淆 前言什么是代码混淆代码混淆&#xff0c;是指将计算机程序的代码&#xff0c;转换成一种功能上等价&#xff0c;但是难于阅读和理解的形式的行为。 代码混淆常见手段1、名称混淆 将有意义的类&#xff0c;字段、方法名称更改为无意义的字符串。生成…

Leetcode—160.相交链表【简单】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—160.相交链表 算法思想 两个链表的节点之和是相等的 如果两个链表相交&#xff0c;那么相交点之后的长度是相同的 我们需要做的事情是&#xff0c;让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短…

leetcode 41. 缺失的第一个正数

目录&#xff1a;原题链接 暴力排序 桶排序 桶排序Set 桶排序分治思想 官方题解 桶排序数组内标记 桶排序额外数组标记&#xff08;更好理解&#xff09; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) …

1-1、汇编语言概述

语雀原文链接 文章目录 1、机器语言2、汇编语言&#xff08;Assembly Language&#xff09;汇编语言工作过程汇编语言三类指令 3、学习资料电子PDF课件论坛视频教程 1、机器语言 机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器…

【牛客网】SQL必知必会题解

SQL 必知必会题解 地址&#xff1a;牛客网在线编程_SQL篇_SQL必知必会 (nowcoder.com) 检索数据 从 Customers 表中检索所有的 ID 现有表 Customers 如下&#xff1a; cust_idABC 【问题】编写 SQL 语句&#xff0c;从 Customers 表中检索所有的 cust_id 答案&#xff1a;…

SAP MPN物料简介

MPN物料-Manufacturer Part Number (MPN) 我们将把它简称为MPN物料。所谓制造商零件号&#xff0c;指的是以制造商&#xff08;注意不是供应商&#xff09;作为区分依据&#xff0c;为事实上的同一种物料定义不同的物料号。 我们在业务逻辑中&#xff0c;一物一码是基本的业务…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SCN随机配置网络多变量回归预测 1.data为数据集&#xff0c;7个输入特征&#xff0…

JDBC编程基础

JDBC编程基础 JDBC介绍创建JDBC项目的步骤1.引入依赖2.注册驱动3.获取数据库连接4.获取sql执行对象 JDBC 常用 API 详解sql执行对象PreparedStatement作用 事务管理结果集对象 JDBC项目demo测试 JDBC介绍 每个数据库都会提供一组API来支持程序员实现自己客户端&#xff0c;自己…

vim工具以及如何给用户加上sudo的权限

Linux开发工具之vim以及如何给用户配置sudo的权限文件的操作 1.vim概念的介绍 2.vim的多模式的介绍 3.vim的命令模式与低行模式的相关指令操作 4.vim如何配置 5.如何给普通用户配置sudo的权限 本文开始~~~~ 1. vim概念的介绍 vim是一款多模式的文本编辑器&#xff0c;简单…

C++之哈希

unordered系列容器的效率之所以比较高(尤其是查找),是因为它底层使用了哈希结构,即哈希表. 哈希概念 前言: 顺序结构以及平衡树中, 元素关键码与其存储位置之间没有对应的关系, 因此在查找一个元素 时, 必须要经过关键码的多次比较. 顺序查找时间复杂度为O(N), 平衡树中为树的…

【微服务】java 规则引擎使用详解

目录 一、什么是规则引擎 1.1 规则引擎概述 1.2 规则引擎执行过程 二、为什么要使用规则引擎 2.1 使用规则引擎的好处 2.1.1 易于维护和更新 2.1.2 增强应用程序的准确性和效率 2.1.3 加快应用程序的开发和部署 2.1.4 支持可视化和可管理性 2.2 规则引擎使用场景 三、…

MySQL(主从复制)

简述&#xff1a;主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff0c;主数据库一般是准实时的 业务数据库、事务处理库&#xff0c;从库做查询库。 复制过程简单的说就是 master 将数据库的改变写入二进制日志&#xff0c…