Skip to content

3)请求头解析

特性请求头(Request Header)请求体(Request Body)
定义存储关于请求的元信息,如客户端环境、认证信息等。存储实际的数据,通常是客户端提交的内容。
数据位置位于请求的头部部分。位于请求的主体部分。
常见用途传递客户端信息、内容类型、认证信息、跨域等元数据。传递实际数据,如表单数据、JSON、文件等。
格式通常是键值对格式,如 Content-Type, Authorization 等。根据 Content-Type 不同,格式可以是 JSON、XML、表单数据等。
传输频率每次请求都会发送,通常是轻量级的,包含少量信息。仅在某些请求(如 POSTPUT)中使用,通常比请求头的数据量大。
是否必需对每个 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 TokenBasic 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 请求通常包含一些特定的头字段,如 OriginAccess-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-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"));
  • 简单请求:浏览器直接发送的请求,如 GETPOST 请求。
  • 预检请求:对于某些类型的跨域请求(如 PUTDELETE 请求或带有自定义头字段的请求),浏览器会先发送一个预检请求(OPTIONS),服务器返回允许的操作方法。

请求头解析总结:

  1. 用户代理(User-Agent):包含浏览器或客户端信息,可以用于做客户端适配或分析。
  2. 语言(Accept-Language):指示客户端接受的语言,服务器可以根据语言返回不同的内容。
  3. 认证信息(Authorization):用于传递身份验证信息,常见的认证方式包括 Bearer Token 和 Basic Authentication。
  4. 跨域请求头(CORS):用于控制跨域请求的权限,通常包含 Origin 和服务器响应的 CORS 相关头字段(如 Access-Control-Allow-Origin)。

通过对请求头的解析,服务器能够根据客户端的环境、身份信息、跨域权限等做出相应的处理和响应。