从零开始学Go web——第一天

news2024/11/25 20:36:01

文章目录

  • 从零开始学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.coloradmin.cn/o/1260256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:输出所有“水仙花数”。“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身,如153=1^3 +5^3+3^3

分析&#xff1a; 在主函数 main 中&#xff0c;程序首先定义四个整型变量 m、a、b 和 c&#xff0c;并用于计算和判断水仙花数。然后使用 printf 函数输出提示信息。 接下来&#xff0c;程序使用 for 循环结构&#xff0c;从 100 到 999 遍历所有三位数。对于每个遍历到的数 m…

C#常见的设计模式-创建型模式

引言 在软件开发过程中&#xff0c;设计模式是一种被广泛采用的思想和实践&#xff0c;可以提供一种标准化的解决方案&#xff0c;以解决特定问题。设计模式分为三种类型&#xff1a;创建型模式、结构型模式和行为型模式。本篇文章将重点介绍C#中常见的创建型模式。 目录 引言…

python实现自动刷平台学时

背景 前一阵子有个朋友让我帮给小忙&#xff0c;因为他每学期都要看视频刷学时&#xff0c;一门平均需要刷500分钟&#xff0c;一学期有3-4门需要刷的。 如果是手动刷的话&#xff0c;比较麻烦&#xff0c;能否帮他做成自动化的。搞成功的话请我吃饭。为了这顿饭&#xff0c;咱…

Elasticsearch:什么是非结构化数据?

非结构化数据定义 非结构化数据是指未按照设计的模型或结构组织的数据。 非结构化数据通常被归类为定性数据&#xff0c;可以是人类或机器生成的。 非结构化数据是最丰富的可用数据类型&#xff0c;经过分析后&#xff0c;可用于指导业务决策并在许多其他用例中实现业务目标。…

正则表达式和awk

目录 一、正则表达式 1.正则表达式基本介绍 2.正则表达式分类 3.基本正则表达式分类 4.代表字符 5.表示次数 6.位置锚定 7.分组或其他 8.扩展正则表达式 二、awk 1.语法 2.选项 3.基础用法 4.内置变量 5.条件判断 6.数组 总结&#xff1a;本章主要介绍了正则表…

【C++】map与set

​&#x1f47b;内容专栏&#xff1a;C/C编程 &#x1f428;本文概括&#xff1a;关联式容器的介绍、set、multiset、map、multimap。 &#x1f43c;本文作者&#xff1a;阿四啊 &#x1f438;发布时间&#xff1a;2023.11.27 一、关联式容器的介绍 在之前C的学习之中&#xf…

STM32入门--看门狗

一、独立看门狗简介 STM32F10xxx内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障&#xff1b;当计数器达到给定的超时值时&#xff0c;触发一个中断(仅适用于窗口型看…

【vue】a-table的斑马纹以及hover样式的修改:

文章目录 一、效果&#xff1a;二、实现&#xff08;以jeecg为例&#xff09;&#xff1a; 一、效果&#xff1a; 二、实现&#xff08;以jeecg为例&#xff09;&#xff1a; // 设置基数行样式 // .ant-table-tbody tr:nth-child(n) { // color: #fff; // }// hover时候每行…

如何使用 Java 在Excel中创建下拉列表

下拉列表&#xff08;下拉框&#xff09;可以确保用户仅从预先给定的选项中进行选择&#xff0c;这样不仅能减少数据输入错误&#xff0c;还能节省时间提高效率。在MS Excel中&#xff0c;我们可以通过 “数据验证” 提供的选项来创建下拉列表&#xff0c;但如果要在Java程序中…

Android应用程序开发实战篇----期末总结1

项目1&#xff08;了解移动电子商务开发&#xff09; 1,任务一&#xff1a;了解移动电子商务 移动电子商务&#xff1a;利用无线终端进行的电子商务活动。 移动电子商务的特点&#xff1a;方便&#xff0c;摆脱时空性&#xff0c;安全&#xff0c;潜在用户规模大&#xff0c;…

loadrunner-关联

loadrunner-关联 文章目录 关联自动关联手动关联手写脚本&#xff0c;关联登录token 关联 关联的作用是将服务器返回的数据保存为参数&#xff0c;后续接口中会用到该参数&#xff0c;当服务器数据发生变更时&#xff0c;脚本中的参数值也同时进行更新。 当脚本中需要服务器返…

Open Feign 源码解析(二) --- 如何发送http请求

Open Feign 源码解析二 如何发送http请求&#xff1f; 如何组件化&#xff1f; 定义接口 public interface Client {Response execute(Request request, Options options) throws IOException; }是否存在已有的方案&#xff1f; 1&#xff09;rest template http client o…

5.9每日一题(幂级数求收敛区间:收敛半径不变的定理)

幂级数逐项求导逐项求积分&#xff08;乘n或者除n&#xff09;&#xff0c;收敛半径不变 幂级数x换成xx0(即平移)&#xff0c;收敛半径不变

手把手教学拥有自己的CLI

随着开发时间的增长&#xff0c;你积累的模版需要管理&#xff0c;不能老是复制粘贴。那么一个小小的cli 可以帮助你这个问题。它是你进行管理分类的管家&#xff0c;替你管理仓库和翻东西。 技术选型 NodeJSTSpnpmunbuild : unbuild 是基于rollup 配置更加单的打包工具chalk :…

【开源】基于Vue.js的无代码动态表单系统的设计和实现

项目编号&#xff1a; S 026 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S026&#xff0c;文末获取源码。} 项目编号&#xff1a;S026&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动…

2023-11-27操作系统---进程—线程—实验

目录 2023-11-27操作系统_进程—线程_实验 5-10&#xff1a; 代码&#xff1a; 运行结果: 5-11 代码&#xff1a; 运行结果&#xff1a;​编辑 2023-11-27操作系统实验 5-10&#xff1a; 代码&#xff1a; #include<unistd.h> #include<stdio.h> #include…

力扣hot100 滑动窗口最大值 单调队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int[] maxSlidingWindow(int[] nums, int k){int n nums.length;int[] res new int[n - k 1]; // 单调递减队列int[] q new int[n];// q数组维护的是元素在 nums 数组对应的下标int…

FFmepg 核心开发库及重要数据结构与API

文章目录 前言一、FFmpeg 核心开发库二、FFmpeg 重要数据结构与 API1、简介2、FFmpeg 解码流程①、FFmpeg2.x 解码流程②、FFmpeg4.x 解码流程 3、FFMpeg 中比较重要的函数以及数据结构①、数据结构②、初始化函数③、音视频解码函数④、文件操作⑤、其他函数 三、FFmpeg 流程1…

史上最细,2个半月从功能进阶自动化测试,进阶指南...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、学习自动化之前…

算法通关村第一关|链表基础

1. 单链表概念 对于所有的数据结构的基础都是创建增删改查&#xff0c;学习链表重点也是学习链表的五种基本操作。 单向链表就像一个铁链一样&#xff0c;元素之间相互连接&#xff0c;包含多个结点&#xff0c;每个结点有一个指向后继元素的next指针。表中最后一个元素的nex…