1
0
mirror of https://github.com/ZSCNetSupportDept/website.git synced 2025-10-28 17:05:03 +08:00
Files
website/blog/Web的历史1️⃣-HTTP.md
2025-07-13 11:23:58 +08:00

113 lines
8.8 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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的历史1⃣-HTTP
<!-- truncate -->
## 起源
人们最初发明网络的目的很简单在不同的电脑之间传输文件。那个时候没有U盘也没有蓝牙计算机领域的前辈们必须从头设计一个高效的传输文件的办法。
假如我们的电脑上有一个文件`example.docx`,放在我们电脑的文件夹`documents`里面,我们如何使用最原始的方法把它传递给另外一台电脑呢?
首先为这台电脑分配一个IP地址IP地址是一台电脑在互联网上唯一标识例如我们电脑的的IP地址是`123.45.67.89`我们在这台电脑上启动一个“HTTP服务程序”在程序的设置里指定"根目录"是我们存放文件的文件夹`documents`
这个HTTP服务程序的作用是把你电脑上一个指定的文件夹(我们称为“根目录”)暴露在互联网上,所有人都可以下载这个文件夹下的文件。
这个时候,打开另一台电脑,在浏览器地址栏中输入`http://123.45.67.89/example.docx`,这时候就会发生神奇的事情:浏览器会提示你下载`example.docx`,这样,文件就从一台电脑传输到了另一台电脑。
假如`documents`文件夹下面还有另外一个文件`hi.txt`,那么当你在浏览器地址栏中输入`http://123.45.67.89/hi.txt`时,你就会发现浏览器显示了`hi.txt`这份文件的内容,因为浏览器可以直接显示`txt`文件,而不能直接显示`docx`文件。
## HTTP协议
等等,刚才所讲的操作为什么能发生呢?当我在浏览器中输入网址并按下回车键的时候,这一切的背后到底发生了什么?
我们之前提到了,要把电脑中的一个文件夹暴露在网络上供所有人访问,就需要启动一个"HTTP服务程序"这个HTTP是什么呢
HTTP协议`HyperText Transfer Protocol`的缩写,即"超文本传输协议"。是通过网络在电脑之间进行文件传输的默认协议。进行HTTP文件传输的双方一个称之为”客户端“(Client),一个称之为"服务端"(Server)。
我们刚才就是在我们的电脑上部署了HTTP服务端而浏览器就是我们通信中的客户端.一次完整的HTTP协议由客户端请求(Request)和服务端响应(Response)组成;**在HTTP协议中总是由客户端先发起一次HTTP请求然后由服务端返回这次请求的响应这样才是一次完整的HTTP通信。**
HTTP协议不仅可以获取一个文件(就像我们所做的),也可以向服务端上传一个文件,或是修改服务端目录下某个文件的内容...
一次HTTP通信需要进行的操作(获取or上传等)由HTTP通信的“方法”指定方法是请求头的一部分。
下面我们介绍HTTP协议的具体内容
### 请求
前面说了HTTP通信总是以客户端发送请求开始服务端是没法主动给客户端发信息的。
一个HTTP请求包含请求头(HTTP Request Header)和请求体(Request Body),请求头主要包含了:
- 目标:要访问哪个电脑,例如刚才的`123.45.67.89`
- URI:要操作哪个文件,例如`example.docx`,IP地址或者网址后面的内容就是URI了
- 方法:要对这个文件做什么,比如获取这个文件的内容还是在服务器上创建这个文件
- User-Agent:说明客户端是什么(是一个浏览器,还是命令行工具,还是爬虫?)
- 自定义参数:除了上面的需要传输的标准内容,客户端还可以发送一些自定义的内容给服务端,这些内容总是以`Key=Value`的形式存在。
比如`content-encoding=gzip`,就是要求服务端把数据用`gzip`压缩之后传输过来方便节省带宽。参数是放在地址栏里传输的在正常的URI之后以`?`开头,以`&`分割,例如,一次完整的HTTP请求是`http://123.45.67.89/example.docx?content-encoding=gzip&greeting=hello`
参数的内容不是HTTP标准也就是服务端如何理解参数完全靠程序员的设置如果程序员设置了`gzip`有关代码,那我们的参数才有意义,否则这些参数完全不起作用。
#### HTTP方法
HTTP方法定义了这个请求具体要对指定的文件做什么其中
- `GET`:获取指定文件的内容;
- `POST`:上传一个文件,内容放在请求体(下面会讲到)
- `PUT`:更新指定的文件,如果没有就创建一个
- `PATCH`:修改指定的文件
- `DELETE`:删除指指定的文件
我们日常使用浏览器,比如在地址栏中输入`baidu.com`,其实就是在对这个地址做GET请求浏览器会把你的输入内容自动补全成 `GET http://www.baidu.com/` ,我们一般使用浏览器没法手动做出除了GET之外的请求但是其他请求今天又被经常使用这其实是前端脚本在工作以后会解释.
##### 请求体
对于某些方法,需要在请求时向服务器夹带一些东西(比如POST,PUT,PATCH需要你带上新文件的内容),请求体就是装载这些东西的.
像GET请求就没有请求体因为GET请求不需要夹带信息.
:::tip 提示
浏览器虽然正常情况下没法做出GET外的请求但是浏览器在控制台里是可以自定义请求的`Firefox`为例在F12的`Network`一栏中点`New Request`(有一个加号)就可以发送自定义请求;例如`curl`等HTTP命令行工具也可以发送请求专业一点的例如`Postman`是一个专业的HTTP测试工具可以满足很多复杂的要求
:::
#### HTTP的响应
回应也分为回应头和回应体,回应头主要包含:
- 状态码针对请求的回应有对应的状态比如如果GET请求没有问题成功返回的话就返回`200 OK`状态码,如果找不到请求里对应的文件就会返回`404 Not Found`
- 内容格式:向浏览器说明回应体(若有)是什么格式的,文本文件的编码设置等比如html文件图片docx文档有没有被压缩如果有压缩格式这决定了浏览器如何对待这些文件
- 内容的大小:返回所请求资源的大小(若有)
回应体就是包含了回应的主体内容了如果是GET请求的话那么就回应了所GET文件的内容如果是其他请求的话可能也会没有回应体具体看使用的方法
#### 一个例子
`GET`方法从服务器获得一个资源我们在浏览器的地址栏输入一个地址时就是在对这个URI做`GET`请求,前面的例子也是通过`GET`方法来进行的。
比如,发送`GET http://developer.zsxyww.com/test/test.txt`,那么就会把我们服务器根目录上`test`文件夹里面的`test.txt`这个文件发过来
`POST`方法向服务器上传一个资源,例如使用某个客户端发送`POST http://example.org/sheet.xlsx`在request body里面带上你的这个文件那么`example.org`网站的根目录下就会多出一个叫做`sheet.xlsx`的文件
除了上面介绍的这些方法,还有`DELETE`,`PATCH`等方法,分别对应了删除,修改一个资源,你可以在你的电脑上通过`curl`等程序,或者通过浏览器控制台来进行常规的`GET`之外的方法请求
:::tip 提示
httpbin.org 这个网站可以让你试验HTTP协议的方法
:::
### 网页与HTML
随着网络的发展,人们发现互联网的潜力远不止于传输文件。特别是浏览器的普及,人们希望能直接在网页上展示丰富的信息,而不只是把浏览器当作下载工具。前面我们说过了,浏览器可以直接展示`txt`文件,但是最大的问题是,`txt`文件是没有样式的。
比如txt无法设置字体大小和颜色,无法加粗、倾斜文字,无法创建表格和列表,无法插入图片和链接。这些都是txt的局限。
为了解决这个问题,人们发明了`HTML`(HyperText Markup Language),就是“超文本标记语言”HTML的核心思想是在普通文本中加入特殊的标记告诉浏览器如何显示内容。
比如`<i>你好~</i>`就是指示浏览器显示`你好~`这段文字,并且以斜体的方式。你可以像打开`txt`文件一样打开`html`文件只不过浏览器默认是加载渲染之后的界面而不是raw HTML
除HTML之外人们还发明了CSS与HTML搭配使用CSS可以对样式做更复杂高级精细的控制这里就不细说了
回到我们的主题不管使用的是什么方法操作的是什么文件HTTP协议传输的对象都是一些固定静态的文件其内容在服务器上是固定不变的除非手动修改这样的网页称为静态网页。
静态网页中,所有用户看到的内容都相同,内容不会根据用户行为动态变化
,服务器只负责传输文件,不进行复杂计算。
我们的wiki就是静态网页在服务端上都对应着html页面只不过加了非常多的样式显得很高级。
很多常见的网站如企业官网、技术文档、个人博客等都是静态网页虽然看起来很精美但本质上就是经过精心设计的HTML和CSS文件。