代码之家  ›  专栏  ›  技术社区  ›  Vickie Jack

Spring MVC 4响应AJAX POST发送错误400

  •  0
  • Vickie Jack  · 技术社区  · 6 年前

    我想将id发送到服务器并删除DB中id为的记录。 我的ajax是:

    var data = {
                    id: 500
                };
    
                    $.ajax({
                        url: 'delete',
                        method: 'POST',
                        contentType: 'application/json',
                        cache: false,
                        processData: false,
                        data: JSON.stringify(data),
                        success: function (res) {
                            showAlert(res.type, res.message);
                            if (res.type == 'success') {
                                row.delete();
                            }
                        }
                    })
    

    我的控制器是:

    @ResponseBody
    @PostMapping("/delete")
    public Alert delete(@RequestParam("id") int id) {
        Alert alert = new Alert(Alert.TYPE_WARNING, Message.get("canNotDelete"));
        if (Service.delete(id)) {
            alert.type = Alert.TYPE_SUCCESS;
            alert.message = Message.get("successDelete");
        }
        return alert;
    }
    

    但服务器发送错误400。

    1 回复  |  直到 6 年前
        1
  •  1
  •   reith    6 年前

    你在搅拌 query string (应该由 @RequestParam )与 post data 主要地 应该由 @RequestBody

    POST /delete
    Content-Type: application/json
    
    {
        "id": 500,
    }
    

    而服务器需要如下请求:

    POST /delete?id=500
    

    它们是不同的 RequestParam 分析表单的post数据,格式为:

    POST /delete
    Content-Type: application/x-www-urlencoded
    
    id=500
    

    1. 去掉JSON主体并将id作为查询字符串或路径参数传递。你可以通过 @PathParam 分别是。无需更改服务器代码即可完成。
    2. 定义一个DTO以将整个请求体作为Java对象。您可以更改控制器代码,如下所示:

      @Controller
      class DeleteController {
      
          @ResponseBody
          @PostMapping("/delete")
          public Alert delete(@RequestBody Request request) {
              Alert alert = new Alert(Alert.TYPE_WARNING, Message.get("canNotDelete"));
              if (Service.delete(request.getId())) {
                  alert.type = Alert.TYPE_SUCCESS;
                  alert.message = Message.get("successDelete");
              }
              return alert;
          }
      
          public static class Request {
              private int id;
              public Request() {}
      
              public int getId() { return id; }
              public void setId(int id) { this.id = id; }
          }
      }