4

我有这个数据结构:

var formValues = {
        TemporaryToken: a.userStatus.get("TemporaryToken"),
        MemorableWordPositionAndValues:[
            {
                Position: a.userStatus.get("MemorableWordPositions")[0],
                Value: this.$('[name="login-memorable-character-1"]').val()
            },
            {
                Position: a.userStatus.get("MemorableWordPositions")[1],
                Value: this.$('[name="login-memorable-character-2"]').val()
            },
            {
                Position: a.userStatus.get("MemorableWordPositions")[2],
                Value: this.$('[name="login-memorable-character-3"]').val()
            }
        ]
    }

当我像这样用 $.ajax 发送它时:

$.ajax({
        url:url,
        type:'PUT',
        //dataType:"json",
        data: JSON.stringify(formValues),
        success:function (data) {

        }
    });

它发送请求。但是,如果我这样发送:

$.ajax({
        url:url,
        type:'PUT',
        dataType:"json",
        data: formValues,
        success:function (data) {

        }
    });

我收到 400 错误请求。这是服务器上的问题还是 JSON.stringify 做的事情与仅将 dataType 设置为“json”不同?

4

3 回答 3

3

服务器需要一个 JSON 字符串,而不是表单参数。JSON.stringify将您的表单参数对象/数组转换为 JSON 字符串,这正是您的服务器所期望的。

于 2013-01-10T16:31:31.263 回答
3

它仍然在第二次尝试发送请求;只是您的服务器不理解该请求。这是因为 jQueryformValues在发送数据之前会自动将数据处理成查询字符串。请参阅文档

数据

类型:对象、字符串

要发送到服务器的数据。如果还不是字符串,则将其转换为查询字符串。它附加到 GET 请求的 url。请参阅 processData 选项以防止此自动处理。对象必须是键/值对。如果 value 是一个数组,jQuery 会根据传统设置的值(如下所述)序列化具有相同键的多个值。

因此,您必须使用JSON.stringify()或不使用 JSON。请注意,设置processData为 false 将无济于事,因为它只会将字符串发送[object Object]到您的服务器。另请参阅此问题

于 2013-01-10T16:44:32.330 回答
0

怎么样$.param()

var my_data = {};
my_data.post_name = 'post_value';
$.ajax({
    url:'/post_url.php'
    data:$.param(my_data);
    ...
});
于 2016-09-04T15:43:49.067 回答