API请求报错 Required request body is missing问题解决

背景

在进行调用的时候,加载方法,提示以下错误

错误信息如下:

javascript 复制代码
{
    "code": 10001,
    "msg": "Required request body is missing:  XXX",
    "data": null,
    "extra": null
}

Required request body is missing 错误通常表明服务器期望在 POST 请求的正文中接收到一些数据,但是实际上没有接收到。这可能是因为客户端没有发送正确的请求体,或者是因为服务器端的配置有问题。

所以根据前后端分别拆分校验定位。

解决过程

1、后端接口验证

使用PostMan直接调用接口。没有发现问题。数据可以正常返回。

PostMan是一个模拟接口调用的工具。具体可以自行百度。

2、前端验证

PostMan可以正常返回数据了。

所以,真相只有一个,那就是前端问题了。

2.1 传输参数定位

代码如下:

javascript 复制代码
apiMethod(this.queryParams).then((response) => {
//业务代码
}

this.queryParams的定义如下:

javascript 复制代码
// 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        due: undefined,
        status: undefined,
        start: undefined,
        end: undefined,
      },

打印参数也OK。

2.2 参数格式问题

后端形参是一个对象,使用的@RequestBody的Post方式。所以应该也不会有问题。

如是,我想了下,是不是传递参数的过程中没有格式化json格式导致的问题。(死马当活马医,因为我用POstman去跑的时候,用的是JSOn格式)

于是我修改为apiMethod(JSON.stringify(this.queryParams))方式,调用的时候发现还是不OK。

如果参数没问题,那么就是传输的时候的问题了,我猜测问题应该是在远程调用的时候的问题。

于是找到JS的方法的api定义方法:

javascript 复制代码
export function apiMethod(query) {
  return request({
    url: "XXXX",
    method: "post",
    query,
  });
}

2.3 传输定义

我把其中的query修改为data:query。然后重新调试,发现问题解决了。

代码如下:

javascript 复制代码
export function apiMethod(query) {
  return request({
    url: "XXXX",
    method: "post",
    data: query,
  });
}

伪代码

后端Controller层:

java 复制代码
@RestController  
@RequestMapping("/api")  
public class MyController {  
  
    @PostMapping("/someEndpoint")  
    public ResponseEntity<String> handlePostRequest(@RequestBody MyVO vo) {  
        // 处理 vo 对象  
        return ResponseEntity.ok("Received request with VO object");  
    }  
}

前端代码:

javascript 复制代码
export function apiMethod(query) {
  return request({
    url: "XXXX",
    method: "post",
    data: query,
  });
}

分析总结

根据实际情况,一般定位这种问题参考以下几点来进行排除:

  • 客户端请求: 客户端必须发送一个包含请求体的 POST 请求。请求体应该是一个 JSON 字符串,其结构与 MyVO 类的字段相匹配。

  • Content-Type: 确保客户端在请求头中设置了正确的 Content-Type,通常为 application/json。

  • VO 类定义: VO 类应该与 JSON 数据中键的字段相对应,并且这些字段应该有正确的 getter 和 setter 方法。如果有任何不匹配,Spring MVC 将无法正确地将 JSON 数据绑定到 VO 对象。

  • Spring 配置: 确保 Spring 应用已经配置了用于处理 JSON 的消息转换器,例如 MappingJackson2HttpMessageConverter。这通常是通过在类路径上有 Jackson 相关的依赖项自动配置的。

  • 异常处理: 检查你的控制器是否有任何异常处理逻辑,它可能会捕获并处理这个错误,而不是将其返回客户端。

基本上使用上面几点来做排除法,问题都能进行解决。如果你已经检查了上述所有点,但问题仍然存在,那么需要查看更详细的日志信息,或者调试 Spring MVC 控制器以查看在何处丢失了请求体。

相关推荐
Fleshy数模1 天前
从数据获取到突破限制:Python爬虫进阶实战全攻略
java·开发语言
像少年啦飞驰点、1 天前
零基础入门 Spring Boot:从“Hello World”到可上线的 Web 应用全闭环指南
java·spring boot·web开发·编程入门·后端开发
苍煜1 天前
万字详解Maven打包策略:从基础插件到多模块实战
java·maven
有来技术1 天前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端
东东5161 天前
xxx医患档案管理系统
java·spring boot·vue·毕业设计·智慧城市
一个响当当的名号1 天前
lectrue9 索引并发控制
java·开发语言·数据库
进阶小白猿1 天前
Java技术八股学习Day30
java·开发语言·学习
hhy_smile1 天前
Class in Python
java·前端·python
qq_12498707531 天前
基于Srpingboot心晴疗愈社平台的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·spring·microsoft·毕业设计·计算机毕业设计
大爱编程♡1 天前
SpringBoot统一功能处理
java·spring boot·后端