3)请求头解析
特性 | 请求头(Request Header) | 请求体(Request Body) |
---|---|---|
定义 | 存储关于请求的元信息,如客户端环境、认证信息等。 | 存储实际的数据,通常是客户端提交的内容。 |
数据位置 | 位于请求的头部部分。 | 位于请求的主体部分。 |
常见用途 | 传递客户端信息、内容类型、认证信息、跨域等元数据。 | 传递实际数据,如表单数据、JSON、文件等。 |
格式 | 通常是键值对格式,如 Content-Type , Authorization 等。 | 根据 Content-Type 不同,格式可以是 JSON、XML、表单数据等。 |
传输频率 | 每次请求都会发送,通常是轻量级的,包含少量信息。 | 仅在某些请求(如 POST 、PUT )中使用,通常比请求头的数据量大。 |
是否必需 | 对每个 HTTP 请求几乎都是必需的,某些头字段是可选的。 | 并非所有请求都有请求体(例如 GET 请求通常没有请求体)。 |
请求头解析:处理用户代理、语言、认证信息、跨域头(CORS)。
请求头(Request Headers)是 HTTP 请求中携带的附加信息,服务器通过解析请求头来了解客户端的环境、请求的内容类型、认证信息等。请求头的解析对于处理跨域请求、用户认证、内容类型等至关重要。
常见的请求头字段包括:用户代理(User-Agent)、语言(Accept-Language)、认证信息(Authorization) 和 跨域请求头(CORS) 等。
1. 用户代理(User-Agent)
- 作用:
User-Agent
字段告诉服务器请求来自哪个浏览器或客户端。它包含了浏览器类型、操作系统版本、设备类型等信息。 - 解析方法:通常,服务器会通过解析
User-Agent
来提供更适合的响应内容。例如,根据浏览器类型返回特定的 CSS 或 JS。
示例请求头:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
代码示例(Express):
javascript
const express = require("express");
const app = express();
app.get("/", (req, res) => {
console.log("User-Agent:", req.get("User-Agent")); // 获取 User-Agent
res.send("Check your console for the User-Agent header");
});
app.listen(3000, () => console.log("Server running on port 3000"));
2. 语言(Accept-Language)
- 作用:
Accept-Language
请求头表示客户端希望接收的语言种类。服务器可以根据这个信息返回合适的语言版本。 - 解析方法:服务器可以根据
Accept-Language
的值选择内容的语言,例如,如果请求头为en-US
,服务器可能会返回英文页面;如果为zh-CN
,则返回中文页面。
示例请求头:
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8
代码示例(Express):
javascript
const express = require("express");
const app = express();
app.get("/", (req, res) => {
console.log("Accept-Language:", req.get("Accept-Language")); // 获取语言信息
res.send("Check your console for the Accept-Language header");
});
app.listen(3000, () => console.log("Server running on port 3000"));
3. 认证信息(Authorization)
- 作用:
Authorization
请求头用于携带身份验证信息,通常用于需要身份验证的 API 请求中。最常见的认证方式包括 Bearer Token 和 Basic Authentication。- Bearer Token:用于携带 OAuth 2.0 令牌。
- Basic Authentication:将用户名和密码使用 Base64 编码后放入
Authorization
字段。
- 解析方法:服务器会解析
Authorization
头来验证用户身份,通常会使用中间件或身份验证函数来处理。
示例请求头:
Authorization: Bearer <token>
或者:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
代码示例(Express):
javascript
const express = require("express");
const app = express();
// 中间件处理认证信息
app.use((req, res, next) => {
const authHeader = req.get("Authorization");
if (authHeader) {
const token = authHeader.split(" ")[1]; // Bearer Token
console.log("Token:", token);
// 进一步验证 token ...
} else {
console.log("No Authorization header");
}
next();
});
app.get("/", (req, res) => {
res.send("Authorization header parsed");
});
app.listen(3000, () => console.log("Server running on port 3000"));
4. 跨域请求头(CORS)
- 作用:跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种允许服务器和浏览器之间交换资源的机制。CORS 请求通常包含一些特定的头字段,如
Origin
、Access-Control-Allow-Origin
、Access-Control-Allow-Methods
和Access-Control-Allow-Headers
,以控制不同源之间的请求。 - 解析方法:当浏览器发送跨域请求时,会自动在请求中附带
Origin
请求头。服务器需要检查这个请求头,并根据需要设置相应的 CORS 响应头来允许或拒绝跨域请求。
常见的跨域请求头字段:
Origin
:指示请求发起的来源(域名、协议、端口)。Access-Control-Allow-Origin
:服务器响应头,指示哪些源可以访问资源。Access-Control-Allow-Methods
:指示哪些 HTTP 方法可以用于访问资源。Access-Control-Allow-Headers
:指示允许哪些请求头字段。
示例请求头:
Origin: http://example.com
代码示例(CORS 处理):
javascript
const express = require("express");
const app = express();
// 允许跨域请求
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*"); // 允许所有源
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization");
next();
});
app.get("/", (req, res) => {
res.send("CORS headers set");
});
app.listen(3000, () => console.log("Server running on port 3000"));
- 简单请求:浏览器直接发送的请求,如
GET
或POST
请求。 - 预检请求:对于某些类型的跨域请求(如
PUT
、DELETE
请求或带有自定义头字段的请求),浏览器会先发送一个预检请求(OPTIONS
),服务器返回允许的操作方法。
请求头解析总结:
- 用户代理(User-Agent):包含浏览器或客户端信息,可以用于做客户端适配或分析。
- 语言(Accept-Language):指示客户端接受的语言,服务器可以根据语言返回不同的内容。
- 认证信息(Authorization):用于传递身份验证信息,常见的认证方式包括 Bearer Token 和 Basic Authentication。
- 跨域请求头(CORS):用于控制跨域请求的权限,通常包含
Origin
和服务器响应的 CORS 相关头字段(如Access-Control-Allow-Origin
)。
通过对请求头的解析,服务器能够根据客户端的环境、身份信息、跨域权限等做出相应的处理和响应。