layui table设method:'post'仍发get,是因为where参数默认拼url导致实际为post+query string,后端@requestbody无法解析;必须禁用where、改用request返回json字符串并配headers:{'content-type':'application/json'}。

layui table 设置 method: 'post' 为什么还是发 GET?
因为 layui 默认把 where 参数拼在 URL 后面(query string),哪怕你写了 method: 'post',实际请求仍是 POST + query string,后端用 @RequestBody 接收时拿不到 body,直接报 400 或空对象。
POST 发 JSON 必须手动接管 data 和 headers
layui 不会自动把 where 序列化成 JSON 字符串。要让后端正确解析,必须:
- 删掉
where配置项(否则它会覆盖你后续的手动设置) - 用
request函数返回一个带data字段的对象,且data是已JSON.stringify()的字符串 - 显式设置
headers: {'Content-Type': 'application/json'} -
method: 'post'必须写,但它只管请求方式,不管 payload 格式
示例:
table.render({
elem: '#demo',
url: '/api/users',
method: 'post',
headers: {'Content-Type': 'application/json'},
request: {
pageName: 'pageNum',
limitName: 'pageSize'
},
parseData: function(res) {
return {
code: res.code === 200,
count: res.data?.total || 0,
data: res.data?.records || []
};
}
});
为什么设了 headers 还报 415 Unsupported Media Type?
415 错误只说明后端拒绝了当前 Content-Type。常见原因有:
- 后端没配置允许
application/json(比如 Spring Boot 缺少@RequestBody对应的 DTO 或参数校验失败) - 前端
headers拼写错误,比如写成header或Header -
request返回的对象里漏了data字段,或data不是字符串(如传了对象) - 后端接口路径被 Nginx 或网关拦截,实际没走到业务层
POST 场景下千万别碰 where
where 和 request 是互斥的:只要用了 where,layui 就强制走 query string 模式,method 和 headers 全部失效。哪怕你只写 where: {} 空对象,也会触发这个逻辑。
真正安全的做法是:
- 搜索/筛选参数全部塞进
request返回的data字符串里 - 分页参数(
pageName/limitName)也由request统一注入,不要混用 - 如果需要动态条件,就在
request函数里读取表单值或全局变量,再拼进 JSON
复杂点在于:每次请求都得手动 JSON.stringify(),且不能依赖闭包存状态——request 函数每次都会被干净地重新执行。











