1
0
mirror of https://github.com/ZSCNetSupportDept/website.git synced 2025-10-29 01:15:04 +08:00
Files
website/docs/devdocs/09-培训/02-Web后端/01-Web后端的简单介绍.md

110 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Web后端的简单介绍
这篇文章将带你学习构建一个Web后端的简单知识;作为一篇基础的教程,我们在教程里不会太多涉及诸如缓存,消息队列等高级内容,而是专注于基础的部分;我们也不会在一开始就涉及到具体的编程语言代码,而是将这篇文章作为一个理论性的介绍.你可能至少需要了解一些计算机的基础知识比如html等才可以了解文章中的一些概念.
## Web的历史
进行Web后端开发首先需要知道Web的一些概念实际上“后端”这个概念不是一开始就存在的随着人们对互联网需求的不断复杂化后端的概念才出现了我们首先来了解Web的发展历史
### 静态网页
互联网最开始只有静态网页所谓“静态”指的是网页中的内容是完全固定的在服务器端存储了内容固定的html,css或者是其他的什么文件用户访问网页就是通过互联网查看这些固定的文件。在这种情况下Web服务本质上更像是远程访问计算机上的某个文件夹这种访问通过HTTP协议来进行。
例如如果要建立一个网站那就在你的电脑上安装一个HTTP服务器比如apache,nginx在设置里指定`root`为你电脑上的某个文件夹然后去买一个域名把域名的DNS绑定到你电脑的IP地址上那么其他人在浏览器上输入你的域名就可以访问`root`文件夹下面的内容了。在下面放一个`index.html`,那浏览器就会默认显示这个文件的内容,在下面放一些图片,比如文件夹下面有:
`$ROOT/foo.jpg``$ROOT/subfolder/bar.jpg`,那么别人在浏览器上面输入`http://yourdomain.com/foo.jpg``http://yourdomain.com/subfolder/bar.jpg`就可以访问到对应的文件。
HTTP协议不仅可以获取一个文件他也可以上传删除一个服务器上面的文件这通过所谓"HTTP方法"来进行,`GET`方法从服务器获得一个资源我们在浏览器的地址栏输入一个地址时就是在对这个URI做`GET`请求,前面的例子也是通过`GET`方法来进行的。
`POST`方法向服务器上传一个资源,例如使用某个客户端发送`POST http://example.org/someprogram.exe`在request body里面带上你的这个文件那么`example.org`网站的根目录下就会多出一个叫做`someprogram.exe`的文件
除了上面介绍的这些方法,还有`DELETE`,`PATCH`等方法,分别对应了删除,修改一个资源,你可以在你的电脑上通过`curl`等程序,或者通过浏览器控制台来进行常规的`GET`之外的方法请求
:::tip 提示
httpbin.org 这个网站可以让你试验HTTP协议的方法
:::
不管使用的是什么方法,这些操作都在对一些固定静态的文件在操作,这些文件的内容是什么就是什么,不会变化,这样的网页就叫做静态网页。
### 动态网页
这样的网页是不能满足大家对互联网的需求的举例子来说淘宝上有数不清的商品在售卖如果淘宝为每一个商品都在服务器目录下面创建一个html文件好让大家通过访问`http://taobao.com/someproduct.html`来查看商品信息,那这个工作量就非常大了,还有一些更重要的问题:作为服务器的管理员,你如何从商家那里获取他们要卖什么?如何通过网页来让顾客点击按钮就可以下单?
#### CGI
这些都是静态互联网无法解决的问题所以程序员们开发了一个叫CGI(Common Gateway Interface,通用网关接口)的技术这种技术在用户请求网站的内容时让一个脚本劫持用户的请求返回给用户一个脚本动态生成的html文件比如如果用户想知道这台计算机目前的内存和硬盘占用情况发送`GET http://example.org/status.html`CGI程序发现给本机请求status.html这个文件并且程序的代码里写了如果是这个文件的话就执行系统的相关操作并将返回结果插入到一个模板html文件中。程序返回这个文件于是用户就受到了CGI程序动态产生的html.
虽然CGI现在很少见了但是将一个发送到服务器的地址请求劫持到脚本函数上是现代动态网站的常用思路。
#### JavaScript
除了服务器浏览器也在为适配动态网站而更新。在1995年网景公司的员工发明了一种编程语言叫做"JavaScript",这是对当时新兴的Java和Java Applet的回应这种语言最大的特点就是它被设计在浏览器中运行并且可以调用相关接口来操作页面htmlcss内容和进行HTTP请求他们让自己家的网景浏览器率先支持了这种编程语言(这个浏览器就是火狐浏览器的前身),这极大的提高了浏览器对于动态网页的支持。
#### AJAX(Asynchronous JavaScript and XML)
尽管是在浏览器里的语言但是作为一个完整编程语言的JavaScript还是非常强大的在有了操作DOM,发起HTTP请求的能力后JavaScript,搭配一些后端的程序可以做到CGI传统动态页面没有办法做到的功能动态更新用户html页面上的内容。传统的后端CGI,可以动态生成html,但是这个html生成之后到用户的手里还是不会变化的而JavaScript,通过运行在用户浏览器,自行发起HTTP请求在用户不关心的情况下可以从后端获取一些内容依据这些内容便可以部分改变用户浏览器所显示的HTML,CSS只需要浏览器重新渲染一遍就行了这种技术就叫做AJAX,Asynchronous JavaScript and XML
AJAX与传统动态页面的不同点是在获取新数据时不是刷新全部的页面而是让JavaScript操作页面的部分内容。同时后端也不是返回html而是返回一些可以被JavaScript理解的序列化数据例如纯文本、XML,JSON等前端的脚本根据这些数据来操作用户的html
这些后端路径不是给用户设计的通过浏览器直接访问这些地方大概会返回一些用户难以读懂的代码他们是给JavaScript,或者另一种程序设计的这种路径就叫做web API他们是两个程序通过HTTP交互的地方而不是人机交互的界面
AJAX技术在今天已经非常常用了以至于很多人都意识不到他们在使用AJAX技术
##### 一个AJAX报名系统的例子
下面举一个例子来详细说明AJAX的工作原理用户需要通过一个网页进行某项活动的报名填写个人信息然后点击网页上的提交按钮服务端会返回报名的结果成功还是失败与传统的方法不同服务器返回信息时不是重新返回一个HTML,而是让浏览器直接在原有的界面上(比如提交按钮的下面)显示报名的状态
用户通过浏览器输入地址,使用`GET`方法发起对`http://example.org/submit.html`的请求服务器获得请求后在root目录下面找到submit.html文件,浏览器得到文件后开始解析渲染这个文件发现这个html在头部又要求浏览器向服务器获取`submit.js`文件,于是浏览器不需要用户处理自己又发送了一条`GET`的HTTP Request,并且执行返回的脚本这个脚本的内容是监听html文件中提交按钮的“点击”事件当按钮被点击时执行某个函数。
返回的html文件包括了提示框要求用户输入姓名手机空闲时间等信息在这些输入栏的最下面有一个提交按钮当点击这个按钮时脚本就会被激活脚本执行的函数将读取用户从上面输入进来的内容做一些简单的认证比如说手机号的格式等然后将这些信息组织成一个XML文件当然,AJAX中的X就是XML咯现在其实也可以用其他的方法序列化比如JSON什么的向服务器发送一个`POST`请求,地址是`http://example.org/api/submit/submit.php`,在请求体中包含刚才的XML文件。
服务器在接收这个请求后,就会将,这个请求的上下文全部转交给`submit.php`这个脚本,脚本再做一些工作,录入数据库,如果一切都成功了,就向客户端发送回应成功,反之则回应失败的消息,回应的内容可以是一个纯文本,或者直接是状态码。
在JavaScript脚本接收到回应后根据返回的内容操作html文件的内容在提交按钮的下面一行插入一个文本块`<p>提交成功!</p>`或者其他的信息
#### URI在现代的意义
从刚才的这个例子中我们可以看到网站的URI,其实慢慢的不止可以指代一个文件了,他更多的是指代一个资源,或者一个业务,向`submit.php`提交一个`POST`请求,难道是在远端创建一个`submit.php`程序?其实在这里更多是指将客户端的数据上传到这个`/api/submit/submit.php`的业务窗口,我们的后端开发,也是建立在这种对虚拟的路径的请求下的。
### Web应用
#### WebSocket
HTTP的动态网站已经很好了但是协议本身有一个缺点:一个HTTP连接分为请求和响应只能由客户端发起请求服务端返回响应如果客户端没有先发一点什么给服务端的话服务端是没办法先给客户端发信息的这就给一些更加复杂的要求增添了障碍比如通过浏览器和别人聊天需要接受来自服务器发给你的其他人的聊天的信息或者是在浏览器上玩游戏需要和服务器交换数据。这可以通过轮询来解决但是这样还是不方便。
WebSocket是一个全新的协议支持客户端和服务器的全双工通信即客户端和服务器都可以主动地发消息而且可以同时进行而且是采用较小的数据帧格式降低了网络开销提高了数据传输速度。WebSocket在建立连接后保持长时间有效不需要为每次消息发送重新建立连接因此效率更高。
为了兼容HTTP协议WebSocket也是监听80和443端口(HTTPS),握手采用了HTTP协议通过升级协议来建立连接如果可以升级服务器会返回101状态码升级连接.
:::info 信息
对于WebSocket过于详细的介绍超出了本篇文章的内容可以自行了解
:::
##### Server-Sent Events
WebSocket是一个全新的协议兼容性可能不是那么好如果要求比较低的话可以看一看Server-Sent Events,这个协议基于HTTP,允许服务器主动给客户端发送信息,当然也请自行了解。
#### 在Web上运行应用
传统观念里一个应用程序是在计算机上直接运行的但是在介绍了上面的技术之后我们可以想到在Web上也是可以运行应用程序的通过现代的高性能JavaScript运行时可以提供类似于原生的运行速度通过WebSocket,可以快速的更新内容现在的HTML和CSS也足够强大用户的机器性能也越来越强了而且开发Web应用可以直接使用成熟的Web技术栈在浏览器中运行也更安全以至于现在很多本地的应用也开始使用Web技术了(electron)。现在流行的单页应用(Single Page Application)后端基本上不参与渲染UI,只是为前端提供API接口这些应用大多数都使用一些前端框架例如`React.js`或者`Vue.js``Next.js`等,许多复杂的功能大多数使用前端完成,也减轻后端的压力,符合“边缘计算”的原则
例如我们所使用的腾讯文档支持多人协作编辑就使用了WebSocket技术来向你主动发送其他人对文档编辑的信息
##### WebAssembly
WebAssembly是最近新出现的技术他允许开发者将C/C++ , Rust等原本的一些编译型语言编译成浏览器可以执行的字节码使得在浏览器中也可以执行这些程序目前也有一些使用WebAssembly的应用可以去看看
## Web后端-是干什么的?
前面用非常长的一段文字来介绍Web的发展历史就是为了说明Web后端是干什么的或者说编写一个Web后端需要干什么
如果你想写一个静态网站那么简单的http服务器就可以满足你不需要你手动写什么代码如果你想写一个基于AJAX的服务比如我们网维现在的报修系统那么你需要设计好API,和前端沟通好序列化相关事项或者是返回JSON信息什么的让前端处理还是返回html让浏览器渲染;如果你想写一个WebSocket的Web应用那就要难一些了可能需要掌握一些并发编程的知识才可以写出一个可以使用的服务
我们接下来的教程将注重开发一个现代的AJAX后端服务同时辅助提供一些静态文件托管的功能。
### Web后端的组成
一个Web后端主要由以下部分组成
- 路由(router)
- 处理(handler)
- 数据库/ORM
- 鉴权
- 模板(如果需要)
详细的信息,请阅读下一篇文章:[Click Me](./基于HTTP的Web后端的组成)
## 参考
在读完这篇文章后你可以去详细阅读这篇文档https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/First_steps/Introduction
这里是关于HTTP协议的详细介绍https://developer.mozilla.org/zh-CN/docs/Web/HTTP