【问题标题】:Malformed AJAX request? Where's the issue?格式错误的 AJAX 请求?问题出在哪里?
【发布时间】:2012-04-06 07:44:44
【问题描述】:

这是我的 AJAX 调用:

var dataString = "{existingProject:'"+ $("#existingProject").val() + "',newProjName:'" + $("#newProjName").val()+"'}";
$.ajax({
        type: "POST",
        url: "manageProjects.html",
        data: dataString,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg.status + " " + msg.responseText);
            $("#grid").trigger("reloadGrid");
        },
        error: function (errormessage) {
            alert(errormessage.status + " " + errormessage.responseText);
        }
    });

..这是我希望处理请求的 Spring MVC 控制器中的方法签名:

@RequestMapping(value="/manageProjects",produces="application/json",method=RequestMethod.POST)
public StatusResponse manageProjects(
        @RequestParam("existingProject") String existingProj,
        @RequestParam("newProjName") String newProj,
        HttpSession session){

我整天都在修补这个 ajax 调用,但我只是没有发现问题。我尝试过使用带有数据参数的加载,post,并且我尝试过不设置 contentType 和 dataType 并使用它。

错误消息中的 responseText 告诉我该调用在语法上不正确......但不知道为什么......

我错过了一些愚蠢的东西。感谢您的任何见解...

【问题讨论】:

  • dataType 不应该是“json”吗?
  • 道歉。我的错字。失败的代码中的“json”。已在 OP 中修复。
  • 你试过这样传递参数吗? "existingProject="+ $("#existingProject").val() + "&newProjName=" + $("#newProjName").val() ... 结果一样吗?
  • 是的,结果相同。值得一提的是,这些值是相互排斥的。一个永远是“”。问题是 val() 没有返回“”而是返回 null,因此我无法满足所需参数的 MVC 签名?
  • 这可能是问题所在,您可能想尝试确保避免发送空值,看看会发生什么

标签: jquery ajax spring model-view-controller


【解决方案1】:

这不是有效的 JSON。

做事

var dataString = JSON.stringify({
    existingProject: $("#existingProject").val(),
    newProjName: $("#newProjName").val()
});

这适用于大多数浏览器。在较旧的浏览器中,您必须包含类似 http://www.sitepoint.com/javascript-json-serialization/ 的定义,注意那里的定义允许您使用先前定义的(本机)版本(如果存在)。

var JSON = JSON || {};  
// implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        }
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    }
};

【讨论】:

  • 采纳了您的建议。使用 JSON.stringify 并让他输出如下所示的数据字符串: "{"existingProject":"default","newProjName":""}" 相同的最终结果:“来自客户端的请求在语法上不正确” 当我更改 MVC使方法所需的签名=false,我可以进入方法但参数为空(尽管我刚刚描述的dataString中不为空)
【解决方案2】:

您是否尝试过将数据放入一个对象并将其设置为 $.ajax 数据选项?

它不必被字符串化。

var data= {"existingProject" : $("#existingProject").val(), "newProjName" : $("#newProjName").val()};

$.ajax({
        type: "POST",
        url: "manageProjects.html",
        data: data,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg.status + " " + msg.responseText);
            $("#grid").trigger("reloadGrid");
        },
        error: function (errormessage) {
            alert(errormessage.status + " " + errormessage.responseText);
        }
    });

【讨论】:

  • 是的,没有变化。如上所述,我得到:“来自客户端的 HttpStatus 400 请求在语法上不正确”。当我更改 MVC 签名以使方法 required=false 时,我可以进入方法但参数为 null(尽管我刚刚描述的 dataString 中不为 null)
  • 嗯,这是您从每个浏览器得到的响应吗?如果您在 firebug 中查看请求,它是否正确显示数据?
  • 尝试了其他发帖者的建议并移至上面发布的简单对象。 Firebug 显示:dataString Object { existingProject="test" newProjName="" } 结果还是一样 :-/
  • 尝试去掉 dataType 和 contentType 选项。我从不使用它们与 ajax 来回发布 json。 Firebug 显示 dataString Object { existingProject="test" newProjName="" } 作为发布的内容?那是……奇怪。
【解决方案3】:

我遇到了同样的问题。我在firefox中使用了tamper data plugin来检查jquery发送的数据。有效载荷是:

POSTDATA=消息=测试+消息

我在我的 JQuery 请求上应用了 JayC 给出的修改并且它有效。详情:

JayC给出的修改:

var dataString = JSON.stringify({
existingProject: $("#existingProject").val(),
newProjName: $("#newProjName").val()
});

我的要求:

      function post(dest) {
            var dataString = JSON.stringify({ message: 'test message'});
            jQuery.ajax({
                type: "POST",
                url: ndest,
                crossDomain: true,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: dataString,
                success: function (data, status, jqXHR) {                       
                },
                error: function (response, textStatus, errorThrown) {
                    handleError(response, textStatus, errorThrown);
                }
            });
        };  

处理请求的 Spring mvc 控制器部分:

@RequestMapping(value="myapp/{id}", method={RequestMethod.POST, RequestMethod.PUT})
@ResponseStatus(HttpStatus.CREATED)
public void setNote(@PathVariable("id") String user,  @RequestBody MyModel content) {

现在有效载荷是:

POSTDATA={"message":"测试消息"}

一些提示:

  • 使用篡改数据或任何其他嗅探器来检查您的请求的负载
  • 我发现您的方法参数中没有@RequestBody。也许您的 json 无法解析,因为您什么都不要求。尝试添加@RequestBody MyClass content。 MyClass 应该有正确的对应 getter 和 setter 以及一个空的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 2018-01-01
    • 2014-07-01
    • 2014-02-06
    • 2011-11-29
    • 2021-12-11
    • 2012-07-16
    • 2021-03-14
    相关资源
    最近更新 更多