你问的这个问题,是很多初学者都会遇到的一个疑惑,尤其是在接触到Web开发后。直接在浏览器地址栏输入URL然后回车,这背后到底是什么样的一个“动作”?是 GET 还是 POST?
简单来说,直接在浏览器地址栏输入URL并回车,执行的是 GET 请求。
但是,我们得把这个“简单”说得更详细一些,才能真正理解它。
为什么是 GET?
想象一下,你坐在电脑前,看着浏览器这个窗口。这个窗口就好像是一个接收你指令的信使。当你打开浏览器,在地址栏里敲入一个网址,比如 `https://www.example.com/aboutus`,然后按下回车键。
这个动作,本质上是在告诉浏览器:“嘿,帮我去找 `https://www.example.com` 这个服务器,然后告诉我它 `/aboutus` 这个页面是什么样的。”
这就是一个典型的信息检索过程。你只是想“获取”(Get)服务器上的某个资源(比如一个网页、一张图片、一个文件),你并没有要“发送”(Post)什么新的数据去改变服务器的状态。
HTTP 协议,就是浏览器和服务器之间交流的语言。它定义了两种最常用的请求方法:
GET:用于从服务器请求数据。它是“幂等”的,也就是说,重复发送同一个 GET 请求,不会对服务器产生任何副作用(除了获取数据本身)。你可以反复地、安全地去获取同一个网页,它不会改变网页的内容。
POST:用于向服务器提交数据,通常是为了创建或更新服务器上的资源。例如,你在一个网站上填写了一个注册表单,点击“提交”按钮,这个动作就会生成一个 POST 请求,把你的注册信息发送给服务器。POST 请求不是幂等的,重复发送可能会导致多次创建同一个数据。
所以,当你直接输入URL时,你就是在说:“告诉我这个URL指向的东西是什么。” 这完全符合 GET 的定义。
细节拆解:一个 GET 请求的旅程
让我们更深入地看看,当你按下回车后,浏览器到底做了什么:
1. 解析 URL:浏览器拿到你输入的 `https://www.example.com/aboutus`,会将其分解成几个部分:
协议:`https`(安全套接字层超文本传输协议)
域名/主机名:`www.example.com`
端口:HTTPS 默认端口是 443(如果没写,浏览器会默认使用)。
路径:`/aboutus`
查询参数:在这个例子中没有,但如果有,比如 `https://www.example.com/search?q=browser`,那么 `?q=browser` 就是查询参数。
2. DNS 查询:浏览器不知道 `www.example.com` 到底在哪个 IP 地址上。它会向 DNS(域名系统)服务器发起请求,询问 `www.example.com` 对应的 IP 地址是什么。一旦得到 IP 地址,浏览器就知道要连接到哪个具体的服务器机器了。
3. 建立连接:
TCP 连接:浏览器会尝试与目标服务器的 IP 地址和端口(HTTPS 的话是 443)建立一个 TCP 连接。这是一个三次握手的过程,确保双方都准备好通信。
TLS/SSL 握手(如果是 HTTPS):由于是 HTTPS,在 TCP 连接之上,还需要进行 TLS/SSL 握手,建立一个加密通道,确保通信的安全。
4. 发送 HTTP 请求:一旦连接建立,浏览器就会构建一个 HTTP 请求报文,并发送给服务器。对于你直接在地址栏输入的URL,这个报文会是这样的:
```http
GET /aboutus HTTP/1.1
Host: www.example.com
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/XX.0.XXXX.XX Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signedexchange;v=b3;q=0.9
AcceptLanguage: enUS,en;q=0.9
Connection: keepalive
// ... 可能还有其他一些请求头
```
`GET /aboutus HTTP/1.1`: 这是请求行,明确指出了请求方法是 `GET`,请求的路径是 `/aboutus`,以及使用的 HTTP 版本是 `HTTP/1.1`。
`Host: www.example.com`: `Host` 请求头是必须的,用于指定目标服务器的域名,这对于一个 IP 地址上托管多个网站非常重要。
其他请求头 (`UserAgent`, `Accept`, `AcceptLanguage`, `Connection` 等):这些头信息提供了关于浏览器本身、它能接受什么类型的内容、它支持的语言以及连接选项等信息。
5. 服务器处理请求:服务器收到这个 GET 请求后,会根据请求的路径 `/aboutus` 找到相应的资源(比如一个 HTML 文件)。
6. 发送 HTTP 响应:服务器找到资源后,会构建一个 HTTP 响应报文,通过已经建立的连接发回给浏览器。
```http
HTTP/1.1 200 OK
ContentType: text/html; charset=UTF8
ContentLength: 12345
Date: Tue, 15 Nov 2023 10:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Connection: keepalive