前置条件:
1、下载代码
2、确保电脑安装node.js (比较新的版本)
3、安装crul工具--我是mac 直接使用brew install curl
代理工具说明
我们知道可以通过url(统一资源定位符)来获取互联网上的各种文件。
url是互联网的基础,网页之间可以通过link来达到互相跳转的功能。
一般来说我们可以通过以下方式来使用url向服务器发送请求:
1、浏览器地址栏
2、curl命令
这两种帮助发送请求的被称为:代理工具(User-Agent)
实际上curl可以模拟还原浏览器向服务端发送请求时所做的事。
我们先来尝试在终端中使用curl看看向服务端发送请求时做了哪些事。
输入curl -v http://baidu.com
从第一行代码到第三行开始看:
curl帮我们通过dns服务器来解析了域名,建立了tcp连接,并且发送请求尝试链接到39.156.69.79这个ip地址,端口号为80 因为我们使用的是http服务。
发送的请求内容:
GET / HTTP /1.1
使用get(获取)的方式来访问 `/`根目录
协议为HTTP 1.1的版本
Host:baidu.com
域名是baidu.com
User-Agent:curl/7.64.1
代理工具是curl,后面是版本号
Accept:*/*
接受所有数据
请求时做了哪些事?
我们从上面的代码可以看出以下步骤:
1、你GET了一下,GET实际上是一个请求动词,意思是想要获取。
2、GET后面的/跟命令行的根目录是一致的,你是不是联想到了什么?没错就是要获取根目录里面的内容
3、HTTP / 1.1 表示用到的http协议是1.1版本(话说这个版本用了几十年 还是很流行啊)
4、Host:baidu.com 你告诉服务器域名是baidu.com
5、User-Agent:curl/7.64.1 代理工具是curl,后面是版本号
6、Accept:/ 表示接受所有数据
打个比方,你现在是在跟服务器这位大哥打招呼:大佬,我需要你传给我一个东西,至于是什么东西,无所谓xxxx。我要从你的根目录上获取xxxx,你要是还不明白的话这个xxxx的对应的域名是xxxx,噢我是用xxxx工具来跟你联络的。
考验来了
上面的xxxx代表什么?
服务器做了什么?
服务器收到请求
请复制在【前置条件】代码,并且拷贝到js文件中,并且新建第一个终端并运行
node server.js(注意路径,要在存放js文件的目录中)
这段代码是什么呢?
实际上这段代码应该放在服务器上,但是因为我没有服务器,所以只好让你把自己的电脑当成服务器来跟自己交互,只需要使用http://127.0.0.1就可以实现和自己对话。
噢,如果代码运行没成功,请按照提示正确输入:
node server.js 8888 实际上这个8888表示端口(port),你随便写,不需要按照我的要求填写8888。
当运行成功后,【新开】一个终端,输入curl -v http://127.0.0.1:xxxx
-
这里的
xxxx就是你输入的端口号,假设这时候设置的是8888 -
-v指的是选项,--verbose的缩写,指定该选项后,可以跟踪URL的连接信息,简单来说能让客户端和服务器的交互更加详细地展示给你看。
这时候回到运行js代码的终端,你看到了什么?
/favicon.ico是默认请求,请忽略。
从上面的反馈信息中,你可以看得出,当你用curl工具发出请求时,服务器端会收到你的信息,如果只写域名的话,默认访问主机的根目录。
整个过程就好像你用curl工具在喊
服务器听到了。
接下去,它在考虑吹点什么
服务器的心路历程
服务器的心路里程取决于你的代码设置
看中间的代码
先看第一行代码:
pathWithQuery就是我在客户端的终端中打的路径,根据下图的提示,可以得出这个路径此时为/,这是因为默认输入域名时访问的是服务器的根目录。
在客户端中重新发送链接curl localhost:8888/x试试,提示内容:
可以看到返回了一串css代码
body{color:red},请记住它后面我们要用到。
对应代码
可以得出结论,当在前端中请求时,服务器会根据请求的路径来判断想访问的内容,并且根据代码来返回对应的内容,这个对应的内容则是写在response.write()中。
response.write是什么
在内部填写一个html代码试试,注意看红框的代码
这时候curl一下试试
可以看到用
curl后服务器端将write()内部的字符串和end()内部的字符串发送返回了。
那么如果用chrome工具发送这段代码会怎样呢?
chrome把这段代码放到了可视化界面上,并且帮你访问了/x,并读取了里面的css代码body:{color:red}从而实现在可视化界面上渲染效果。
为什么我没有发送/x的指令,它却把css代码也渲染出来了呢?
现在请看我在上面图中的红框代码,你知道什么?
没错,说明 <link rel="stylesheet" href="/x">这段代码将链接link到了/x上,自动帮你做了访问,发现这里有一段css,于是css和html帮你做了渲染。
现在我们可以画一张草图来模拟一下客户端和服务端的交互过程,html和css之间发生了什么
最后得出一个简单的结论:
1、如果你用url向服务器发送请求,你写什么路径它就会帮你做判断,看给你返回什么
2、服务器响应的内容取决于服务器程序员写的代码,会返回write()和end()里面的字符串,浏览器会解析内容,并把内容展现在可视化窗口区域
3、你在客户端中发送请求,服务端会返回这个if判断下的write()和end()里面的内容。
延伸
-
通过
<link rel="stylesheet" href="">,服务器会自动帮你访问另外的路径,并做对应的返回。现在知道为什么要写这段代码了吗? -
通过
<script src=""></script>能达到和link一样的效果