在 jQuery 中将 processData 设置为 false 会破坏我的 AJAX 请求

问题描述 投票:0回答:4

我已经用谷歌搜索了一段时间,只能找到

processData: false
的作用。我找不到遇到过同样问题的人。

我将 JSON 传递回服务器,并且不希望 jQuery 自动将数据转换为查询字符串,因此我将 processData 设置为 false。如果我取出 processData,我可以看到请求触发,但是一旦我将其放入,我就看不到任何请求(使用 Firebug 和 Chrome 开发工具)。

$.ajax({
            url: myUrl,
            type: "POST",
            data: {foo: "bar"},
            processData: false,
            contentType: 'application/json'
        });

我最初提出的请求比这更复杂一些,但我已经简化了它以尝试缩小问题范围,但这段简单的代码也不起作用(同样,如果我注释掉 processData,它确实起作用)。另外,我在控制台中没有看到任何 JavaScript 错误。

编辑

对于未来的网络搜索者:正如 lonesomeday 所指出的,如果您提供 JS 对象或格式不正确的 JSON 字符串,jQuery 不会抛出任何错误。它根本不会触发请求。

ajax json jquery
4个回答
24
投票

您想要以 JSON 形式传递数据。您正在传递一个 Javascript 对象。 JSON 是一种将 Javascript 对象序列化为字符串的方法,以便它们可以在没有兼容性问题的情况下传递。

您实际上想以字符串形式传递 JSON:

$.ajax({
    url: myUrl,
    type: "POST",
    data: '{"foo": "bar"}',
    processData: false,
    contentType: 'application/json'
});

12
投票

实际上,

processData
默认假设传递的
data
是一个对象并将其作为
application/x-www-form-urlencoded
发送。

总结上面通过@lonesomeday@vsm所说的内容来发送原始JSON(与表单数据有什么不同),你需要:

$.ajax({
    url: 'http://here-i.am/send-me/an/angel', // Determining far end
    data: JSON.stringify({foo: "bar"}), // Obtaining proper JSON string from data object
    processData: false, // Preventing default data parse behavior
    contentType: "application/json" // Setting proper `ContentType` for our data
    ...
});

1
投票

图我会添加我目前的理解(截至几个小时..)

  • ProcessData = true :将对象的名称值对转换为 URL 编码,或将数组的对象转换为名称值对,或将字符串作为文字。
  • ProcessData = false:将字符串作为文字,或调用对象的 ToString() 方法。

在 ProcessData = true 之上,通过设置“传统”标志,它可以使用捕获复杂结构的递归编码或平面名称值对列表来发送它。

因此,对于 OP,它无需指定 processData 即可工作,因为默认值为 true。因此它将对象中的名称值对转换为 URLEncoded 形式。当您重新添加该行时,它会调用对象的 toString() 方法。由于 toString() 方法没有返回 URL 编码的字符串(没有),因此您将得到一个诸如“[object Object]”的字符串。也许 jQuery 无法发送未进行 URL 编码的字符串,或者不使用继承的 toString() 方法。

提出的两种解决方案将对象转换为 JSON 字符串,因此没有任何处理,因此 processData 不执行任何操作。 contentType 设置帮助服务器了解正在发送的内容。

此外,有人评论说,处理会将编码属性添加到 URL 中。不完全是:它通过最合适的方法发送数据; GET 表示附加到 URL,POST 表示 urlencoded http body。


0
投票

同样的问题,但我将图像传递给 PHP 脚本。我将如何以 JSON 形式传递它。谁能帮助我吗?

我的 JavaScript 代码是 -

const saveAllButton = document.getElementById("buttonSaveAll");

                            function sendAllData() {
                                rowNumber--;
                                current_row = 1;
                                firstSubmission = 0
                                while (current_row <= rowNumber) {
                                    var fd = new FormData();
                                    var pic = $('#pic')[0].files;
                                    var name = document.getElementById("name");
                                    var fname = document.getElementById("fname");
                                    var mname = document.getElementById("mname");
                                    var grade = document.getElementById("class");
                                    var mobile = document.getElementById("phone");

                                    if (firstSubmission > 0) {
                                        var pic = $(`#pic${current_row}`)[0].files;
                                        var name = document.getElementById(`name${current_row}`);
                                        var fname = document.getElementById(`fname${current_row}`);
                                        var mname = document.getElementById(`mname${current_row}`);
                                        var grade = document.getElementById(`class${current_row}`);
                                        var mobile = document.getElementById(`phone${current_row}`);
                                    }
                                    fd.append('pic', pic[0]);
                                    $.ajax({
                                        type: "GET",
                                        url: "submitAllData.php",
                                        data: {
                                            name: name.value,
                                            fname: fname.value,
                                            mname: mname.value,
                                            class: grade.value,
                                            mobile: mobile.value,
                                            fd
                                        },
                                        processData:false,
                                        success:function(data){
                                            alert("Submitted Successfully !" + data);
                                        }
                                    });
                                    current_row++;
                                    firstSubmission++;
                                }
                                $current_row = 0;
                                $firstSubmission = 0;
                            }

                            saveAllButton.addEventListener('click', sendAllData)

以及 PHP 代码 -

session_start();
$email = $_SESSION['email'];
include "db.php";
$con = mysqli_connect($server, $username, $password, $database);
$email = $_SESSION["email"];
$name = $_POST["name"];
$fname = $_POST["fname"];
$mname = $_POST["mname"];
$grade = $_POST["class"];
$phone = $_POST["mobile"];
$state_sql = "SELECT state FROM schooldetails WHERE email='$email'";
$state_sql = mysqli_query($con,$state_sql);
$state = mysqli_fetch_assoc($state_sql)['state'];
$email = $_SESSION['email'];
$filepath = "student_uploads" . "/" . $_FILES['pic']['name'];
$school_name_sql = "SELECT school_name FROM users WHERE email='$email'";
$school_name_sql = mysqli_query($con,$school_name_sql);
$result = mysqli_fetch_assoc($school_name_sql);
$school_name = $result['school_name'];
$sql = "INSERT INTO studentdetails (school_name,state,email,name,mname,fname,class,mobile,file_path) VALUES ('$school_name','$state','$email','$name','$mname','$fname','$grade','$phone','$filepath')";
$sql - mysqli_query($con,$sql);
$con->close();
?>
© www.soinside.com 2019 - 2024. All rights reserved.