单元三 做一个网络服务 · 第 10 课
网站是怎么跑起来的
接下来我们要做一个自己的网站。动手之前,先用十分钟弄明白:在浏览器里输入网址、按下回车之后,到底发生了什么。
本课目标
- 看懂一个网址由哪几部分组成。
- 理解域名、IP、端口、DNS 的关系。
- 知道 HTTP 请求、响应和状态码是什么。
- 明白
localhost指的是哪里。
先懂概念:寄一封信
访问网站,很像给一家公司寄信:
| 网络里的词 | 寄信的类比 | 例子 |
|---|---|---|
| 域名 | 公司名称,好记 | xairouter.com |
| DNS | 查号台:把公司名称查成地址 | 把 xairouter.com 查成一串数字 |
| IP 地址 | 大楼的门牌号,机器认这个 | 203.0.113.10 |
| 端口 | 大楼里的房间号,一台电脑上可以有很多服务 | 443、3000 |
| HTTP 请求 | 你寄出的信 | “请把首页给我” |
| HTTP 响应 | 对方的回信 | 首页的内容 |
服务器就是大楼里一直有人值班的房间:它24小时开着,等着有人来信,收到就回信。我们要做的“服务端程序”,就是这个值班的人。
网址的组成
https://report.example.com:443/api/report
└─┬─┘ └───────┬────────┘ └┬┘ └───┬────┘
协议 域名 端口 路径- 协议:
https是加密的 HTTP,http是不加密的。 - 域名:
report.example.com中,example.com是买来的域名,report是你自己起的子域名。 - 端口:
https默认是 443,http默认是 80,默认时可以省略不写。我们自己的程序在开发时常用 3000。 - 路径:要找的是这个网站里的哪一页、哪个功能。
HTTP:一问一答
浏览器发出请求,服务器回复响应。请求有不同的“动作”:
GET:取东西,比如打开一个网页;POST:交东西,比如提交一个表单。
每个响应都带一个三位数的状态码,告诉你结果如何:
| 状态码 | 意思 |
|---|---|
| 200 | 成功 |
| 301 / 302 / 308 | 搬家了,请去新地址 |
| 401 | 需要登录 |
| 404 | 找不到这个页面 |
| 429 | 请求太频繁 |
| 500 | 服务器内部出错 |
| 502 / 503 | 服务器暂时不可用 |
后面调试时,看到状态码就能大致判断问题出在哪一边:4 开头多半是请求的问题,5 开头多半是服务器的问题。
localhost:自己这台电脑
localhost(也写作 127.0.0.1)是一个特殊的地址,意思是这台电脑自己。在自己电脑上运行的服务,用 http://localhost:3000 就能访问。
别人的电脑能不能访问,取决于服务监听的地址:只监听 127.0.0.1 的服务,只有本机能访问;监听所有网卡(0.0.0.0)的服务,同一个网络里的其他电脑也可能访问到。这门课在自己电脑上开发时,都让服务只监听 127.0.0.1。下一课你就会用到它。
跟着做
1. 用浏览器看请求
打开浏览器,访问本站首页,按 F12(macOS 按 Command + Option + I)打开开发者工具,切换到“网络(Network)”标签,再按一次刷新。
你会看到一长串请求,每一行是浏览器向服务器要的一样东西:网页、图片、样式表……“状态(Status)”那一列就是状态码,大部分是 200。
2. 用终端发请求
curl 是终端里的“浏览器”,可以直接发 HTTP 请求。
curl.exe -I https://xairouter.comcurl -I https://xairouter.comWindows PowerShell 里的
curl其实是另一个命令的别名,用法不同,所以要写成curl.exe。
-I 表示只看响应的“信封”(响应头),不看正文。第一行会显示协议和状态码,比如 HTTP/2 200。
3. 查一查 DNS
nslookup xairouter.comWindows 和 macOS 都有这个命令。输出的 Address 就是这个域名对应的 IP 地址,这就是“查号台”的结果。
你应该看到
- 开发者工具里有很多状态码为 200 的请求。
curl的第一行是HTTP/2 200或HTTP/1.1 200 OK。nslookup输出了一个或几个 IP 地址。
常见问题
curl 报错说参数不对? Windows 上要用 curl.exe,不是 curl。
nslookup 显示很多行看不懂? 只看最后的 Name 和 Address,前面几行是你电脑用的 DNS 服务器。
自检
- 我能指出一个网址里的协议、域名、端口和路径。
- 我能用寄信的类比解释域名、DNS、IP、端口。
- 我知道 200、401、404、500 分别是什么意思。
- 我知道
localhost指的是自己这台电脑。