【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"];
});