Skip to content

2)请求体解析

请求体解析:JSON、XML、表单数据、文件上传(MIME、Multipart)。

在 Web 开发中,请求体(Request Body)是客户端发送给服务器的数据部分。解析请求体的过程是后端服务能够正确处理客户端发送的数据的关键。不同类型的请求体需要使用不同的解析方法。常见的请求体类型有:JSON、XML、表单数据、文件上传。在这些类型中,常见的协议和格式如下:

1. JSON 格式

  • 特点:JSON 是一种轻量级的数据交换格式,广泛用于现代 Web API 中,特别是 RESTful API。
  • 解析方法
    • Express.js 中,使用 express.json() 中间件来解析请求体中的 JSON 数据。
    • 解析后,req.body 中会自动包含解析后的 JavaScript 对象。
javascript
const express = require("express");
const app = express();

// 使用 express.json() 中间件解析 JSON 数据
app.use(express.json());

app.post("/data", (req, res) => {
  console.log(req.body); // 输出解析后的对象
  res.send("JSON data received");
});
  • 请求头Content-Type: application/json
  • 示例请求体
    json
    {
      "name": "John",
      "age": 30
    }

2. XML 格式

  • 特点:XML 是另一种常见的数据交换格式,尽管现在 JSON 更为流行,但在一些旧系统或特定协议中仍使用 XML。
  • 解析方法
    • 使用 xml2js 等库将 XML 转换为 JavaScript 对象。需要将 xml2js 或其他库作为中间件来解析 XML 数据。
javascript
const express = require("express");
const xml2js = require("xml2js");
const app = express();

// 中间件:解析 XML 格式的请求体
app.use(express.text({ type: "application/xml" }));

app.post("/xml", (req, res) => {
  xml2js.parseString(req.body, (err, result) => {
    if (err) {
      return res.status(400).send("Invalid XML");
    }
    console.log(result);
    res.send("XML data received and parsed");
  });
});
  • 请求头Content-Type: application/xml
  • 示例请求体
    xml
    <user>
      <name>John</name>
      <age>30</age>
    </user>

3. 表单数据(URL 编码表单)

  • 特点:这是最常见的表单提交方式,数据通过 URL 编码格式传输。在 Web 表单中,当 enctype="application/x-www-form-urlencoded" 时,表单数据会以这种格式发送。
  • 解析方法
    • Express.js 中,使用 express.urlencoded() 中间件来解析请求体中的表单数据。
    • 解析后,req.body 会包含键值对形式的数据。
javascript
const express = require("express");
const app = express();

// 使用 express.urlencoded() 中间件解析 URL 编码表单数据
app.use(express.urlencoded({ extended: true }));

app.post("/form", (req, res) => {
  console.log(req.body); // 输出解析后的表单数据
  res.send("Form data received");
});
  • 请求头Content-Type: application/x-www-form-urlencoded
  • 示例请求体
    name=John&age=30

4. 表单数据(Multipart/Form-Data)——文件上传

  • 特点:这种格式用于上传文件和其他数据。每个表单字段都作为单独的部分传输,每个部分有自己的内容类型。常用于文件上传。
  • 解析方法
    • Express.js 中,可以使用 multer 中间件来处理文件上传。
    • multer 解析后的数据会存储在 req.bodyreq.files 中,其中 req.files 包含上传的文件。
javascript
const express = require("express");
const multer = require("multer");
const app = express();

// 配置 multer 存储
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "uploads/");
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + "-" + file.originalname);
  },
});

const upload = multer({ storage: storage });

app.post("/upload", upload.single("file"), (req, res) => {
  console.log(req.body); // 输出表单数据
  console.log(req.file); // 输出上传的文件信息
  res.send("File uploaded successfully");
});
  • 请求头Content-Type: multipart/form-data

  • 示例请求体

    --boundary
    Content-Disposition: form-data; name="field1"
    
    value1
    --boundary
    Content-Disposition: form-data; name="file"; filename="example.txt"
    Content-Type: text/plain
    
    (file content here)
    --boundary--

请求体解析总结:

  1. JSON 格式:使用 express.json() 中间件来解析请求体中的 JSON 数据。
  2. XML 格式:使用库如 xml2js 来解析 XML 数据。
  3. URL 编码表单:使用 express.urlencoded() 中间件解析 URL 编码表单数据。
  4. Multipart 表单(文件上传):使用 multer 中间件来处理文件上传和表单数据。

通过正确的请求体解析,你的服务器能够根据不同的客户端请求格式进行正确的数据处理和响应。