- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍。目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个做任何事情的动态 Web 程序应该是很轻松的,接下来我们就去学习了解一些关于 Web 的相关基础,了解一些概念,以及 Golang 是如何运行一个 Web 程序的。 文章预计分为四个部分逐步更新 2023-04-13 星期四 一更 全文共计约 3800 字 阅读大约花费 5 分钟 。
其实当你输入网址(URL)并按下回车之后,你的浏览器相当于扮演了 客户端 的角色,首先你的浏览器会去请求 DNS 服务器进行域名解析,将你输入的 URL 地址 转化为对应的 ip 地址,通过 ip 地址 我们就可以找到对应的服务器位置,从而进行 TCP 连接.
连接之后,你的浏览器会发送 HTTP 请求 (Request)包,服务区收到请求包之后开始从响应处理请求包,调用自身的服务,并返回 HTTP 响应 (Response)包.
客户端收到了来自服务端的响应之后开始渲染这个响应包里的主体(body),等收到了全部的内容应答后,就会断开与服务器的 TCP 连接 (这里先讨论一般情况) 如图👇 。
而一个 Web 服务器也被称作 HTTP 服务器, 它通过 http 协议与客户端通信。这个客户端通常是指 Web 浏览器 。
所以 Web 服务器的工作原理可以简单的总结为:
以上步骤实现了一个 最简单的 HTTP 事务,在上述情况中,客户端与服务端的通信非持久连接,发送接收应答后就断开(这里暂时不讨论 http 1.1 之后的持久连接、后文会有专门说明) 。
URL 是 Uniform Resource Locator“统一资源定位符” 的英文缩写 基本格式如下图👇 。
而 DNS 则是 Domain Name System “域名系统” 的英文缩写,它是一种组织成 域层次结构的计算机和网络服务命名系统,它用于 TCP/IP 网络,它从事 将主机名 或者 域名转换为实际 IP 地址的工作。可以把他理解成 URL 的“翻译官” 。
工作原理如下图👇 。
我们来详细地解释一下 关于 DNS 的工作原理:
无论是转发模式还是非转发模式,是转发给上一级还是直接找根 DNS ,最后都是把 结果返回给 本地 DNS 服务器,由此 DNS服务器再返回给 我们的浏览器(客户端) 。
流程图如下👇 。
基于上面的步骤,浏览器最终通过 DNS 服务器获得的是 IP 地址,所以浏览器(客户端)发起请求的时候是通过 IP 地址 来和 服务器 进行信息通信的 。
HTTP 协议当然是 Web 服务器工作的核心,所以我们接下来具体详细地了解清楚一下 HTTP 协议是怎么发挥作用的 。
HTTP 协议 是一种能让 Web 服务器与浏览器(客户端)通过 Internet 进行发送和接受数据 动作 的一个协议,它建立在 TCP 协议之上,一般会采用 TCP 的 80 端口。它是一个标准的 “请求-响应协议” 即 客户端发出请求,服务端收到请求返回响应.
在 HTTP 协议中,客户端总是要通过建立一个连接与发送一个 HTTP 请求来发起一个 事务 。而服务器不能主动去与客户端联系,也不能给客户端发出一个回调连接,只能被动监听.
客户端与服务端都可以自行提前中断一个连接,例如,当浏览器下载一个文件时,你可以随时通过点击“暂停”按钮来中断文件的下载,关闭与服务器的 HTTP 连接.
HTTP 协议是无状态的,同一个客户端的这一次请求与上次请求之间没有对应关系,对 HTTP 服务器来说,它并不知道这两个请求是否来自同一个客户端。当然对于需要解决这个问题的情况我们可以使用 "Cookie" 机制来维护连接的可持续状态 。
正因为 HTTP 协议是建立在 TCP 协议之上的,所以 TCP 攻击一样会影响 HTTP 的通信,例如常见的针对 TCP 的攻击:SYN Flood (比较流行的一种 Dos 拒绝服务攻击 和 Ddos 分布式拒绝服务攻击)就是通过利用 TCP 协议的缺陷,发送了大量的伪造 TCP 连接请求从而使得被攻击的服务器资源耗尽(CPU 满负荷或者内存不足) 。
接下来我们分别看看 HTTP 协议的 请求包和响应包 。
我们可以使用 F12 查看一些内容,例如 Request 包的结构: Request 包分为三部分,第一部分叫 Request line (请求行),第二部分是 Request header (请求头),第三部分是 body(主体),header 和 body 之间会有个空行隔开 请求包的实例图👇 。
HTTP 协议定义了很多与服务器交互的请求方法,最基础的四种是:GET\POST\PUT\DELETE,一个 URL 地址用于描述一个网络上的请求资源,而 HTTP 中的这四个操作就分别对应对这个资源的查改增删4个操作 。
这四个操作中最熟悉和常用的是 GET 和 POST 。 GET 一般用于获取/查询资源信息 POST 一般用于更新资源信息 GET 与 POST 的区别:
关于 GET 与 POST 之间更详细的比较可参考我的另一篇 blog👇 GET 和 POST 到底有什么区别?
HTTP 的 response 包的结构如下图👇 。
和上面看到的请求包类似,response 响应包的第一行叫做 ”状态行“ ,由 HTTP 协议版本号、状态码、状态消息 三部分组成 状态码的作用是告诉 HTTP 客户端(浏览器),HTTP 服务器是否产生了预期的 Response。 在 HTTP 1.1 协议中定义了 5 类 状态码,每个状态码由三位数字组成,首位表示类别:
常见的状态有:200 :正常信息、302:跳转、404 not found 等等 。
无状态是指协议对于事物处理没有记忆能力,服务器不知道客户端是什么状态,体现在打开一个服务器的网页和你之前打开这个服务器的网页之间没有任何联系 。
HTTP 协议就是典型的无状态的面向连接的协议,虽然是无状态但是它是面向连接的协议,所以千万不要说 HTTP 使用的是 UDP (面向无连接)的协议了!!! 无状态不代表不能保持TCP连接 (只要不断开连接我就不管你什么状态不状态的) 从 HTTP 1.1 开始,默认都开启了 叫做 Keep-Alive 的保持连接的特性,也就是当一个网页打开完成之后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的 TCP 连接 。
当然 Keep-ALive 不会永久保持连接,它会有一个保持时间上限,你可以自行设置 。
如果你尝试去检查(F12)访问任意一个网址 通过分析整个 URL 请求的通信过程,你会发现: 在所有的请求中不止一个 URL 请求,还会有很多其他的如静态文件的资源请求 这其实是浏览器自带的功能之一,第一次请求 url ,服务器端返回的是 HTML 页面,然后浏览器会开始渲染这个页面,但是当解析到 HTML DOM里面的图片连接、css脚本和js脚本的连接的时候,浏览器就会自动地发起一个请求静态资源的 HTTP 请求,去获取相应的资源并渲染,最终将所有资源整合完整地展现出来 。
在网页优化中就会有一项措施,就是利用减少 HTTP 请求次数(把尽量多的css 和 js 资源合并)减少网页请求静态资源的次数,来提高网页的加载速度,减轻服务器的压力 。
关于 Golang 基础部分 以及 计算机网络部分读者可以参阅我的往期 blog👇 Goalng:基础复习一遍过 。
漫谈计算机网络:网络层 ------ 重点:IP协议与互联网路由选择协议 。
以上 。
看完记得留下一个👍 。
最后此篇关于GoForWeb:踏入Web大门的第一步——Web的工作方式的文章就讲到这里了,如果你想了解更多关于GoForWeb:踏入Web大门的第一步——Web的工作方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个几乎可以构建的Maven / Grails应用,但在web.xml上找不到[my-app]\webapp\WEB-INF\web.xml。但是目录结构像往常一样包含web-app文件夹,而不是
正如我在标题中提到的:我想知道 web-service 和 web-socket 之间的区别?我们什么时候使用每一个? 谢谢! 最佳答案 一个web service是一个响应客户端 SOAP/REST
让我们看一个示例场景: 客户端打开一个网站并找到他从文本框中输入的两个数字的总和。然后单击“添加”按钮。两个参数通过 HTTP GET 发送到服务器,在服务器上写入 PHP 代码以添加数字,结果为回声
我知道这是一个老问题,肯定已经被回答了数百次,但我还无法找到令人满意的答案。 我正在创建一个应用程序,其他应用程序(移动/网络)将使用该应用程序来获取数据。现在我有两个选择: 将我的应用程序创建为简单
通过 Web 作业部署新功能有 3 种方法: 创建一个新的 Web 应用,并部署一个包含该函数的 Web 作业。 向现有 Web 作业添加一项新函数(这样您现在在一个 Web 作业中就拥有了多个函数)
我收到来自网络场景的通知,上面写着“问题”和“确定”。我想在问题发生时包含网络响应的内容。我不担心标题值,只担心网页的内容. 这是我可以在通知设置中引用的变量吗? 最佳答案 不幸的是 zabbix 不
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
嗨,这是一个理论问题,但我真的无法弄清楚 Web 应用程序、基于 Web 的应用程序和基于云的应用程序之间的区别。这个你能帮我吗。 最佳答案 @Matt 是对的 - 这真的无关紧要,但是,为了清楚起见
我正在尝试使用多个 Web 服务,这些服务在它们的 wsdl 中重新定义了一些相同的公共(public)类。我目前在网站中引用了它们,但我想转换为 Web 应用程序。 由于一些相同的类是从多个 Web
一个。我必须考虑哪些事项?b.当前应用程序正在执行多个存储过程。如果我创建等效的方法来执行这些过程,会有什么风险或挑战。 最佳答案 在架构上,将网络应用程序转换为网络服务时必须考虑的一件事是,对方法和
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
网络 API 和网络服务之间有什么区别吗?或者它们是同一个吗? 最佳答案 网络服务通常提供 WSDL您可以从中自动创建客户端 stub 。 Web 服务基于 SOAP protocol 。ASP.NE
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我正在使用 stub 将我的网络服务相关测试与实际网络服务隔离开来。 你/我应该如何合并测试以确保我制作的响应与实际的网络服务匹配(我无法控制它)? 我不想知道怎么做,而是何时何地? 我应该为测试数据
我在互联网上搜索了很多,但我仍然没有得到网络服务和网络 API 之间的明显区别?我在某处读到所有 Web 服务都是 API,但所有 API 都不是 Web 服务。如何? 我所知道的是两者都允许利用其他
假设我已经完成了使用 JavaEE 制作的 Web 应用程序。这个 Web 应用程序包含登录系统,但最后它是非常基本的 Web 应用程序。我使用的是 GlassFish 3.1.2.2。 我想知道一旦
我希望设计者能够打开与我相同的解决方案文件。这可以通过 Expressions Web 实现吗? 最佳答案 简短的回答是“不”;但这是一个非常常见的请求,我知道很多人都希望下一个版本(无论何时)对此有
我正在尝试在 CF10 中创建一个 Web 服务对象。我已验证它在 SoapUI 中按预期工作。但是,当我在 CF 中运行它时,我得到一个错误,它无法找到在 WSDL 的导入语句中导入的 XSD。这是
我的要求是开发一个 Web 服务,充当外部 Web 服务和客户端之间的中间人。 我知道,我可以为我的服务设计一个wsdl,然后将外部wsdl映射到代码中我的wsdl。我的问题是有一个开源 api/工具
我是一名优秀的程序员,十分优秀!