Layui.table设method:'post'仍发GET是因where参数默认拼URL,需禁用where、改用request返回JSON字符串并配headers:{'Content-Type':'application/json'},否则后端@RequestBody无法解析。
layui.table 设置 method: 'post' 后仍发 GET 请求?
不是配置没生效,而是 method: 'post' 仅控制请求方式,不自动改变参数提交格式。layui 默认把 where 参数拼在 url 后作为 query string 发送(即 ?k=v&k2=v2),哪怕 method 是 post —— 这会导致后端收不到 body 数据,尤其用 @requestbody 接收时直接 400 或空对象。
POST 发送 JSON 数据必须显式设置 contentType 和 data 序列化
要让后端能用 @RequestBody 正确解析,前端必须:发送纯 JSON 字符串到请求体,并声明 Content-Type: application/json。Layui 原生不支持自动序列化 where 为 JSON,需手动干预:
- 删掉
where配置项(避免被自动转成 query string) - 改用
request配置接管请求参数生成逻辑 - 在
request中返回一个带data字段的对象,且该字段是已JSON.stringify()的字符串 - 通过
headers设置{'Content-Type': 'application/json'}
示例:
table.render({
elem: '#demo',
url: '/api/users',
method: 'post',
headers: {'Content-Type': 'application/json'},
request: {
pageName: 'pageNum', // ← 若后端分页参数叫 pageNum 而非 page
limitName: 'pageSize'
},
parseData: function(res) {
return {
code: res.code === 200,
count: res.data?.total || 0,
data: res.data?.records || []
};
},
// ⚠️ 不要写 where: { ... },否则会覆盖 request 的 data 行为
});
为什么设了 method: 'post' 还报 415 Unsupported Media Type?
415 错误只说明后端拒绝了当前 Content-Type。常见原因有:
-
headers拼写错误,比如写成header(少个 s)或大小写不一致 - 用了
contentType字段(Layui 无此配置项,是无效的) - 后端 Spring Boot 未开启 JSON 支持(检查是否漏了
@EnableWebMvc或 Jackson 依赖) - 前端发了 JSON 字符串,但后端 Controller 方法没加
@RequestBody注解 - 某些旧版 Layui(如 2.5.x)对
headers支持不完整,建议升级到 2.8+ 或改用beforeSend拦截(见下条)
兼容旧版 Layui 或需要动态 token 的场景:用 ajax 自定义请求
当 headers 不生效,或需在请求前动态取 token、加签名等,直接弃用内置 url,改用 done 回调 + 手动 $.ajax 更可靠:
- 初始化时设
url: null、page: false,禁用自动请求 - 在页面 ready 后手动发 POST,携带 token、JSON body
- 成功后调用
table.reload()并传入data参数注入原始响应
关键点:table.reload() 的 data 必须是数组,且结构要和 parseData 返回值一致(含 count、data 字段),否则分页会失效。











