内容目录
- —— 什么是 HTTP GET 请求?
- —— 什么是 Preflight 请求?
- —— GET 请求与 Preflight 请求的交互
- —— 示例
- —— 总结
在 Web 开发中,HTTP 请求是客户端与服务器之间通信的基础。GET 请求是最常见的 HTTP 请求类型之一,用于从服务器请求数据。而在跨域请求中,Preflight 请求则用于确保客户端发起的请求符合服务器的安全策略。本文将详细介绍 HTTP GET 请求及其相关的 Preflight 请求机制。
什么是 HTTP GET 请求?
HTTP GET 请求用于请求服务器上的资源。当用户在浏览器地址栏输入一个 URL 或者点击一个链接时,浏览器会发送一个 GET 请求到服务器,请求指定的资源。GET 请求的特点如下:
- 无状态性
- GET 请求是无状态的,这意味着每次请求都是独立的,不依赖于前一次请求。
- 幂等性
- 发送多次相同的 GET 请求,服务器会返回相同的结果,不会改变服务器上的状态。
- 安全性
- GET 请求不应该用于发送敏感信息,因为请求的参数会出现在 URL 中,容易被记录和截获。
- 缓存性
- GET 请求可以被浏览器缓存,如果资源没有变化,浏览器可以直接使用缓存中的数据。
什么是 Preflight 请求?
Preflight 请求是 CORS(Cross-Origin Resource Sharing,跨域资源共享)机制的一部分。当浏览器检测到一个请求具有某些复杂的行为特征时(如使用了自定义的 HTTP 方法或携带了自定义头),它会先发送一个 OPTIONS 请求到服务器,询问服务器是否允许进行这样的跨域请求。这个 OPTIONS 请求就是 Preflight 请求。
Preflight 请求的特点如下:
- 目的
- Preflight 请求的目的是为了确认服务器是否允许特定的跨域请求,包括 HTTP 方法、头部信息、请求体等。
- 请求头
- Preflight 请求的请求头包含
Access-Control-Request-Method
,指示预期的请求方法,如GET
、POST
等。 - Preflight 请求还包含
Access-Control-Request-Headers
,列出客户端将在实际请求中使用的自定义头部。
- 响应头
- 服务器响应 Preflight 请求时,会使用
Access-Control-Allow-Methods
来指示允许的方法。 - 服务器还会使用
Access-Control-Allow-Headers
来指示允许的头部。 - 如果服务器同意 Preflight 请求,它还会设置
Access-Control-Max-Age
头部,指示在多长时间内可以缓存此次 Preflight 请求的结果。
- 缓存
- Preflight 请求的结果是可以被缓存的,这意味着在一段时间内,浏览器不需要每次都发送 Preflight 请求。
GET 请求与 Preflight 请求的交互
当浏览器发起一个跨域的 GET 请求时,如果请求满足以下条件之一,就会触发 Preflight 请求:
- 包含自定义的请求头(如
X-Custom-Header
)。 - 请求方法不是
GET
、HEAD
或POST
。 - POST 请求中包含了除了
application/x-www-form-urlencoded
、multipart/form-data
、text/plain
之外的媒体类型。
示例
假设一个客户端想要通过 GET 请求从另一个域获取数据,并且请求中包含了自定义头 X-Requested-With
,则浏览器会首先发送一个 Preflight OPTIONS 请求:
OPTIONS /data HTTP/1.1
Host: example.com
Origin: http://client.example.org
Access-Control-Request-Method: GET
Access-Control-Request-Headers: x-requested-with
User-Agent: Mozilla/5.0 ...
服务器响应 Preflight 请求:
HTTP/1.1 200 OK
Date: Tue, 14 Oct 2008 12:00:00 GMT
Server: Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.7d
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: X-Requested-With
Content-Length: 0
Content-Type: text/plain
如果 Preflight 请求成功,客户端将继续发送实际的 GET 请求:
GET /data HTTP/1.1
Host: example.com
Origin: http://client.example.org
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 ...
总结
本文详细介绍了 HTTP GET 请求的工作原理以及 Preflight 请求在跨域请求中的作用。理解这些概念对于开发安全可靠的 Web 应用程序至关重要。希望本文能够帮助您更好地理解 HTTP 请求以及如何处理跨域请求。