我在使用 ajax 将 json 数据发送到控制器时遇到问题

Posted

技术标签:

【中文标题】我在使用 ajax 将 json 数据发送到控制器时遇到问题【英文标题】:I have a problem sending json data to a controller with ajax 【发布时间】:2020-01-30 20:07:49 【问题描述】:

我在使用 ajax 向控制器发送 json 数据时遇到问题。

我认为我已经很好地发送了数据,但我收到了以下警告。

org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - 已解决 [org.springframework.web.bind.MissingServletRequestParameterException: 所需的 int 参数 'bno' 不存在]

代码:400 消息:HTTP 状态 400 – 错误请求 1 font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px; h2 font-family:Tahoma,Arial,sans -serif;color:white;background-color:#525D76;font-size:16px; h3 font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size: 14px; body font-family:Tahoma,Arial,sans-serif;color:black;background-color:white; b font-family:Tahoma,Arial,sans-serif;color:white;background-color: #525D76; p font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px; a color:black; a.name color:black; 。行 height:1px;background-color:#525D76;border:none;

HTTP 状态 400 – 错误请求

类型状态报告

消息所需的 int 参数 'bno' 不存在

说明服务器不能或不会处理请求,因为某些东西被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求)任务路由)。

Apache Tomcat/8.5.34

我将展示我的 ajax 代码

var headers = "Content-Type" : "application/json"
        ,"X-HTTP-Method-Override" : "DELETE"
      ;
$.ajax(
          url: root+"/restcmt/"+uid+"/"+cno
              , headers: headers
              , type: 'DELETE'
              , data : JSON.stringify("bno":bno)
              , beforeSend : function(xhr)
                    xhr.setRequestHeader(_csrf_name, _csrf_token);
                
              , success: function(result)
                  showcmtlist(bno);
              
              , error: function(request,status,error)
                console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);


                
          );

还有我的控制器

    @RequestMapping(value="/uid/cno", method=RequestMethod.DELETE)
    public void deletecmt(@PathVariable int cno ,@PathVariable String uid,@RequestParam int bno
            ,@AuthenticationPrincipal SecurityCustomUser securityCustomUser) throws Exception

    

并请求有效负载

"bno":14

我不确定出了什么问题。 怎么了?

【问题讨论】:

【参考方案1】:

在Spring-World中的请求payload应该对应@RequestBody,例如:

public SomethingElse updateValue(@RequestBody Something value) 
    // ...

其中“某物”是任何 POJO。

要使用@RequestParam,请参阅: https://github.com/jquery/jquery/issues/3269

($.ajax 在 DELETE 正文中发送data 属性而不是查询字符串)

【讨论】:

【参考方案2】:

"bno": bno 在请求的正文中。所以你的Controller方法应该是@RequestBody int bno@RequestParam 用于 servlet 请求参数。即:/uid/cno?bno=14

差异供参考:What is difference between @RequestBody and @RequestParam?

【讨论】:

啊哈!多亏了你,我才知道两者之间的区别。谢谢!

以上是关于我在使用 ajax 将 json 数据发送到控制器时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC - 将 HTML 表转换为 json 并使用 ajax 发送到控制器

如何使用ajax将数据从视图发送到控制器laravel?

使用ajax将照片和多个数据发送到控制器

将带有香草 Js 的数组从 Ajax 发送到 Laravel 控制器

Java 类接收 Ajax JSON 帖子为 null

将数据从 javascript 发送到 Laravel 控制器