二、HTTP协议概念及工作流程
这部分内容参考了哔哩哔哩燕十八:
1 URI结构
HTTP
使用统一资源标识符(URI
)来传输数据和建立连接。URL
(统一资源定位符)是一种特殊种类的URI,包含了用于查找的资源的足够的信息,我们一般常用的就是 URL
,而一个完整的URL
包含下面几部分:
http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first
1.协议部分:该 URL
的协议部分为 http:
,表示网页用的是HTTP协议,后面的 //
为分隔符。
2.域名部分:域名是 www.fishbay.cn
,发送请求时,需要向 DNS
服务器解析 IP
。如果为了优化请求,可以直接用IP作为域名部分使用。
3.端口部分:域名后面的 80
表示端口,和域名之间用:分隔,端口不是一个 URL
的必须的部分。如果端口是 80
,也可以省略不写。
4.虚拟目录部分:从域名的第一个 /
开始到最后一个 /
为止,是虚拟目录的部分。其中,虚拟目录也不是 URL
必须的部分,本例中的虚拟目录是 /mix/
。
5.文件名部分:从域名最后一个 /
开始到 ?
为止,是文件名部分;如果没有 ?
,则是从域名最后一个 /
开始到 #
为止,是文件名部分;如果没有 ?
和 #
,那么就从域名的最后一个 /
从开始到结束,都是文件名部分。本例中的文件名是 76.html
,文件名也不是一个 URL
的必须部分,如果没有文件名,则使用默认文件名。
6.锚部分:
-
它的主要作用是指向网页中的一个特定部分或元素,而不是整个页面(比如:定位到页面中的特定部分,这在长网页文档中非常有用,用户可以快速定位到他们感兴趣的部分)。
-
从
#
开始到最后,都是锚部分。本部分的锚部分是first
,锚也不是一个URL
必须的部分。
7.参数部分:从 ?
开始到 #
为止之间的部分是参数部分,又称为搜索部分、查询部分。本例中的参数是 name=kelvin&password=123456
,如果有多个参数,各个参数之间用 &
作为分隔符。
2 Request
HTTP的请求包括:请求行(request line)、请求头部(header)、空行 和 请求数据 四个部分组成。
请求头部和请求数据之间必须有一个空行
我们在Windows环境下,使用 telnet
请求和接受 HTTP
协议。Windows下默认不能使用 telnet
,我们需要手动启动。
2.1 GET请求方法
2.1.1 编写PHP文件
- 创建PHP文件:
C:\Apache24\htdocs\20240104\01.php
- 输入以下内容:
<?php if (isset($_GET['name']) && isset($_GET['age'])) { // 如果 name 和 age 变量都存在 $name = $_GET['name']; $age = $_GET['age']; // 打印 name 和 age echo "Name: " . $name . ", Age: " . $age; } else { // 如果 name 和 age 变量中有任何一个不存在 echo "没有输入"; } ?>
2.1.2 使用telnet发送请求
打开 cmd
终端,输入 telnet 127.0.0.1 80
,键盘按下 Ctl + ]
,然后回车 ENTER
,把下面内容粘贴进入,然后回车(有时候可能不需要)。
GET /20240104/01.php?name=lieryang&age=25 HTTP/1.1
HOST: localhost:80
2.2 POST请求方法
2.2.1 编写PHP文件
- 创建PHP文件:
C:\Apache24\20240104\htdocs\02.php
- 输入以下内容:
<?php // 检查是否有 POST 数据 if ($_SERVER["REQUEST_METHOD"] == "POST") { // 打印 name 和 age 字段 if(isset($_POST['name']) && isset($_POST['age'])) { echo "Name: " . $_POST['name'] . "<br>"; echo "Age: " . $_POST['age']; } else { echo "Name or Age is not set in POST request."; } } else { echo "No POST data received."; } ?>
2.2.2 使用telnet发送请求
打开 cmd
终端,输入 telnet 127.0.0.1 80
,键盘按下 Ctl + ]
,然后回车 ENTER
,把下面内容粘贴进入,然后回车(有时候可能不需要)。
application/x-www-form-urlencoded 表示Form数据(表单数据),Content-Length 表示整个表单数据的长度。表单数据格式 key=value 用 & 分割每一组。
POST /20240104/02.php HTTP/1.1
Host: localhost:80
Content-Type:application/x-www-form-urlencoded
Content-Length:20
name=zhangsan&age=19
3 Response
3.1 状态码
- 200:服务器成功返回网页
- 301/2:永久/临时重定向
- 304:未修改
-
307:重定向中保持原有的请求数据
- 404:请求的网页不存在
- 503:服务器暂时不可用
- 500:服务器内部错误
3.1.1 重定向状态码304
1.目录 C:\Apache24\htdocs\20240104\
下面随便放入一张图片,命名为 test.jpg
。
2.新建文件:C:\Apache24\htdocs\20240104\03.html
,输入以下内容:
<!DOCTYPE html>
<html>
<head>
<title>图片展示页面</title>
</head>
<body>
<h1>欢迎来到我的网页</h1>
<p>这是一张图片:</p>
<img src="./test.jpg" alt="测试图片">
</body>
</html>
3.浏览器访问 http://localhost/20240104/03.html
,F12
打开调试窗口,刷新页面查看请求信息。
4.手动请求图片
GET /20240104/test.jpg HTTP/1.1
Host: localhost
If-Modified-Since: Fri, 05 Jan 2024 06:46:35 GMT
If-None-Match: "159e-60e2d35918e67"
3.1.2 重定向状态码307
新建项目文件 05.html
、05.php
、06.php
由于 05.php
重定向到 06.php
,导致POST数据丢失,所以要使用 307
保持重定向中保持原有的请求数据。