【http】http协议传参及后端参数解析方式

2023/01/07 17:03:352021/09/09 14:42:16

传参方式并不受请求类型的影响(post,get),get 请求也可以传递请求体参数(body),post 请求也可以传递查询参数(query)。

请求头参数(header)

将参数携带在 header 中,get 和 post 都支持。

注意如果是跨域访问的话需要在服务端响应头设置“允许的 header 类型” Access-Control-Allow-Headers

传参

$.ajax({
  headers: {
    abc: "ddd",
  },
});

后台解析

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  let params = req.headers["abc"];
});
app.post("/", (req, res) => {
  let params = req.headers["abc"];
});

路径参数(params)

参数跟在路径后面,用 / 分隔,get 和 post 都支持。

传参

$.ajax({
  url: "http://localhost:3000/999",
});

后台解析

const express = require("express");
const app = express();

app.get("/:num", (req, res) => {
  let params = req.params["num"];
});

app.post("/:num", (req, res) => {
  let params = req.params["num"];
});

查询参数(query)

在请求路径后加上 ? 并使用 & 分隔参数,get 和 post 都支持。

传参

$.ajax({
  url: "http://localhost:3000?name=zkb",
});

后台解析

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  let params = req.query["name"];
});
app.post("/", (req, res) => {
  let params = req.query["name"];
});

请求体参数 (body)

body 参数受到 content-type 请求头的影响,详见ContentType 对传参格式的影响

一般来说都是在 post 请求中传递 body 参数,但是 http 中并没有规定 get 请求不能接受 body 参数,所以实际上 get 请求也是可以接受 body 参数的。

传参

经过测试在 chrome 浏览器中尝试用 fetch 在 get 请求传递 body 参数时会报错 :

fetch("http://localhost:3000", {
  method: "get",
  headers: {
    "content-type": "application/json;charset=utf-8",
  },
  body: JSON.stringify({
    name: 1,
  }),
});

// 以下是报错信息
// VM538:23 Uncaught (in promise) TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.

在服务端用 axios 可以传递,但是同样的代码在浏览器中不会传递(不报错):

axios.request("http://localhost:3000", {
  method: "get",
  data: {
    age: 25,
  },
});

后台解析

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  let params = req.body["name"];
});
app.post("/", (req, res) => {
  let params = req.body["name"];
});