当前位置: 首页 > 知识库问答 >
问题:

springboot - axios发送POST请求后 @RequestBody无法获取json参数 无报错且不执行(vue+element+admin)咋办呐?

夏骏
2023-12-03
axios 向springboot后台发送post请求传入json格式的值  后台@RequestBody获取不到传入的参数,不报错也不向下执行

前台

export function login(data) {   //输入进来的data为一个键值对对象  return  request({    url: '/user/login',    method: 'post',    data,    headers:{      "Content-Type":"application/json"    }  })}
发送的请求信息为user_name:rose password:1


后台

@PostMapping ("/user/login")    public void login(@RequestBody ParamLogin paramLogin){        System.out.println("收到参数");        System.out.println(paramLogin.getUser_name()+" "+paramLogin.getPassword());    }
@Data@EqualsAndHashCode(callSuper = false)public class ParamLogin implements Serializable {//    @JsonProperty("user_name")    private String user_name;//    @JsonProperty("password")    private String password;}
结果就是后台输出执行不到 System.out.println("收到参数"); 我主观觉得 @RequestBody 为和获取到值。尝试使用过HttpServletRequest request获取请求的body,但是 request.getInputStream().available() 又为 0表示body里面没值。同时用apifox测试过后端API 可以接收到post 的json数据。


能够解析json
但是axios的无论是封装后还是原生的都无法接收到post的值。

第二天

继续尝试:添加判断用HttpServletRequest获取请求报文的相关信息。

String contentLength = paramLogin.getHeader("Content-Length");        if (contentLength != null && Integer.parseInt(contentLength) > 0) {            // 可以读取请求体            BufferedReader reader = paramLogin.getReader();            System.out.println(reader+" this is reader");            System.out.println("contentLength: "+contentLength);            String line;            if ((line = reader.readLine()) != null) {                // 进入循环                 while ((line = reader.readLine()) != null) {                                System.out.println("while+1");                                System.out.println(line);                            }            } else {                // 请求体为空,不需要读取                System.out.println("失败");            }            // 进行读取操作        } else {            System.out.println("出错啦");            // 不需要读取请求体        }

1.对于axios发送过来的信息

成功获取Header,对Body做数据流读取的时候失败,依旧是无数据
收到参数application/jsonorg.apache.catalina.connector.CoyoteReader@21bc0330 this is readercontentLength: 35收到参数null出错啦

2.用IDEA自带的Http服务测试功能测试

###POST http://localhost:8088/user/loginContent-Type: application/json{  "user_name": "qwee",  "password": "21"}
成功有数据结果
收到参数application/jsonthis is reader: org.apache.catalina.connector.CoyoteReader@21bc0330 contentLength: 45  "user_name": "qwee",  "password": "21"
由此可以判断我的axios发送的请求报文似乎有问题,现在继续尝试。qaq帮帮孩子

共有1个答案

司寇高峯
2023-12-03

这个问题可能是由于前端发送请求和后端接收请求的方式不完全匹配导致的。以下是几个可能的解决方案:

  1. 在前端请求中,将 JSON 对象转换为字符串。在 axios 中,可以通过将数据作为字符串传递,或者使用 JSON.stringify() 方法将其转换为字符串。这样,@RequestBody 注解可以正确地将其解析为 JSON 对象。
export function login(data) {   // 输入进来的data为一个键值对对象  return request({    url: '/user/login',    method: 'post',    data: JSON.stringify(data),    headers: {      "Content-Type": "application/json"    }  })}
  1. 在后端中,确保你正在使用 Jackson 或 Gson 等库将请求体解析为 JSON 对象。如果你正在使用 Spring Boot,那么它应该会自动处理这个问题。请确保你没有在 ParamLogin 类中显式地定义 user_namepassword 字段,因为这可能会干扰 @RequestBody 的解析。
  2. 检查请求的 Content-Type 是否正确设置为 "application/json"。如果不正确,那么后端可能无法正确解析请求体。
  3. 在后端中打印出请求的整个 HTTP 报文,以便于调试。这可以通过在 Controller 方法的开始添加一行 System.out.println(request.getBody()); 来实现。如果请求体为空,那么可能存在其他问题。
  4. 如果以上步骤都无法解决问题,那么可能需要进一步检查是否存在其他问题,例如:是否存在防火墙或其他中间件可能会干扰请求?是否存在其他因素可能会导致请求被篡改?
 类似资料:
  • 这是我的控制器: 这是我的配置: 这是类别类: 如果我尝试发送内容类型为application/json和以下正文的post请求: {“id”:8,“title”:“Паа”、“engTitle”:“Pizza”、“description”:null,“menuItems”:[{“id”:4,“title”:“Паааааааааааа”和“engTitle”:“Pepperoni”、“price

  • 请问大佬们,如何通过axios,去实现post请求,并且请求参数为JOSN格式传入body内?我这样的写法有什么错误吗?请求就提示跨域报错

  • 我目前正在做一个项目,我需要向spring发送一个POST请求。我已经找了好几个小时的解决方案,但没有找到一个可行的。当我开发该部件时,请求起了作用。问题是,在创建一些新功能(另一个控制器中有两个新endpoint)后,用于创建或更新实体的POST请求停止工作,而不会更改特定区域中的代码。 控制器: 最初,关于消费和生产的部分不在那里,我尝试了它,因为在其他帖子上看到了它,但对情况没有帮助。 传感

  • axios请求点击控制器上的url,但将空值设置到POJO类中,当我使用chrome中的开发人员工具时,有效负载包含数据。我做错了什么? Axios POST请求: 浏览器响应: 过帐多部分/表单数据时出错。Content-Type标头缺少边界 谁能解释一下如何设置边界或者我如何使用Axios发送表单数据。

  • 我正在尝试根据下面的代码提出帖子请求: 此请求不需要身份验证,也不需要登录和密码。在邮递员那里,我可以成功地提出请求,但当我尝试执行上述代码时,我得到了: 401未经授权 我在邮递员那里模拟了错误,它给了我下面的信息: 当我在Postman中将身份验证方法更改为“No Auth”时,请求运行良好。 我想我必须在代码中设置这个选项“No Auth”,但我不知道如何设置。 我这样做: 但错误仍在继续。

  • 我正试图根据以下代码发出post请求: 在Postman,此请求工作正常,不需要身份验证,无需登录名、密码或令牌即可工作。但是,上面的代码不起作用。 日志控制台的一部分如下: 我无法粘贴整个stacktrace,因为stackoverflow平台不允许。