You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13 App Router中如何读取GET请求的请求体?

解决方案:Next.js 13 App Router中GET路由无法读取请求体的问题

核心原因

HTTP规范里,GET请求的设计目的是获取资源,本身不包含请求体的语义。绝大多数客户端(包括axios)和服务器框架(包括Next.js)都会忽略GET请求的请求体,这就是你看到request.body为null、调用request.json()报错的根本原因。


可行解决方案

方案1:改用POST/PUT等支持请求体的HTTP方法(推荐)

这是符合HTTP规范的标准做法,适合传递复杂数据的场景。

后端修改为POST路由处理器:

export async function POST(request: Request) {
  try {
    const data = await request.json();
    console.log(data); // 正常获取 { name: 'john doe' }
    return Response.json({ msg: 'success', data });
  } catch (e) {
    console.log('err', e);
    return Response.json({ msg: 'err' });
  }
}

前端修改为POST请求:

const res = await axios.post('http://localhost:3000/api/finduser', {
  name: 'john doe'
});

方案2:必须用GET时,将数据放在查询参数中

如果业务场景要求必须使用GET请求,可将数据拼接在URL的查询参数里。

前端通过params传递数据:

const res = await axios.get('http://localhost:3000/api/finduser', {
  params: {
    name: 'john doe'
  }
});

后端通过searchParams获取数据:

export async function GET(request: Request) {
  const name = request.nextUrl.searchParams.get('name');
  console.log(name); // 输出 'john doe'
  // 若有多个参数,可转为对象:
  // const allParams = Object.fromEntries(request.nextUrl.searchParams.entries());
  return Response.json({ msg: 'success', name });
}

注意事项

不要强行给GET请求加请求体,这种做法不符合HTTP语义,会导致兼容性问题(比如部分CDN、代理服务器会直接丢弃GET的请求体),后续维护也会埋下隐患。

内容的提问来源于stack exchange,提问作者Abel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:17:10