HTTPQUERY
English

GET

用法

GET 请求用于获取数据,而不会修改服务器状态。请求体中的任何内容通常没有明确定义的语义,整个查询都通过目标 URI 和请求头来表达。响应默认可缓存,这使 GET 成为 Web 缓存的基础。

GET 是浏览器进行导航、点击链接以及提交未指定 method 属性的表单时的默认方法。

HTTP 规范并未禁止 GET 请求携带请求体,但这种请求体的语义是未定义的。浏览器和 Fetch API 会剥离 GET 请求体。许多服务器和代理会忽略或拒绝它们。依赖 GET 请求中的请求体对互操作性而言并不安全。

特性

由于 GET 是安全且幂等的,多次发送相同请求会产生相同的结果,且不会改变资源。浏览器、爬虫和代理都依赖这一保证。

条件 GET

当请求中包含一个或多个校验器请求头时,GET 请求就变成了条件请求:If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since 或 If-Range。服务器会评估条件,仅在条件满足时返回完整表示。

部分 GET

包含 Range 请求头会将 GET 变为部分请求。服务器仅返回请求的字节范围,并附带 206 状态码。416 状态码表示该范围无法满足。不支持范围请求的服务器会返回 200 及完整响应体。

部分 GET 适用于恢复中断的下载,以及分段流式传输大文件。

基本 GET

一个最小的 GET 请求用于获取根资源。服务器返回 200 及完整表示。

请求

GET / HTTP/1.1
Host: example.com

响应

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1256

<!doctype html>
<html>...

条件 GET

此请求包含 If-Modified-Since,因此服务器仅在资源自指定日期以来发生变化时才返回响应体。未变化的资源会产生一个没有响应体的 304。

请求

GET / HTTP/1.1
Host: example.com
If-Modified-Since: Sat, 01 Jan 2022 12:00:00 GMT

响应(未修改)

HTTP/1.1 304 Not Modified
ETag: "abc123"

部分 GET

Range 请求头仅请求前 512 个字节。服务器以 206 响应,并附带 Content-Range 请求头指明返回的片段。

请求

GET /file.bin HTTP/1.1
Host: example.com
Range: bytes=0-511

响应

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-511/8192
Content-Length: 512

CORS

GET 是 CORS 安全列表方法。跨域 GET 请求不会触发预检请求,这使 GET 成为浏览器中跨域获取资源的默认方法。

GET 与 POST 对比

GET 用于获取数据。POST 用于提交数据以供处理。GET 参数通过 URL 查询字符串传递,而 POST 参数则放在请求体中。

GET 响应可缓存且可加入书签。POST 响应只有在包含明确的新鲜度信息时才可缓存。URL 存在实际长度限制,这限制了 GET 能携带的数据量。POST 则没有实际的请求体大小限制。

GET 既安全又幂等。POST 两者皆非。重复的 GET 返回相同的结果。重复的 POST 会创建重复的资源或触发两次处理。

GET 和 POST 之间的性能差异可以忽略不计。选择取决于操作本身:获取使用 GET,提交使用 POST。

安全

GET 参数会出现在 URL、浏览器历史记录、服务器日志和 Referer 请求头中。密码、令牌和个人身份信息等敏感数据绝不能出现在查询字符串中。

GET 请求更容易受到 CSRF 攻击,因为 标签会自动触发 GET 请求。POST 在没有适当令牌保护的情况下同样容易受到 CSRF 攻击。

GET 和 POST 本身都不提供加密。必须使用 HTTPS 来保护传输中的数据。

SEO 影响

搜索引擎使用 GET 进行抓取。Googlebot 和其他爬虫通过 GET 获取并索引页面,因此只有当资源能响应普通 GET 请求时才可被发现。可缓存、幂等的 GET 响应抓取效率最高,因为爬虫会复用 ETag 和 Last-Modified 等校验器,从而跳过对未变化页面的重新抓取。