【问题标题】:Should I validate response data in jQuery's ajax success handler?我应该在 jQuery 的 ajax 成功处理程序中验证响应数据吗?
【发布时间】:2016-08-24 17:52:14
【问题描述】:

假设我有一个 post AJAX 调用,我想将返回的数据放入一些 HTML 元素中。

$.post(settings.url, function(data) {
    $('#someElement').text(data.someData1);
    $('#someElement2').text(data.someData2);
});

我是一名后端开发人员,我很自然地必须对来自用户的任何数据进行服务器端验证。虽然情况正好相反,但上面的代码对我来说感觉有点不对劲(未验证外部数据)。但另一方面,我知道我从服务器返回了什么。

问题是很好相信从(也是我的)后端应用程序返回的data 将具有预期的结构,还是我应该以某种方式验证每个来自服务器的数据? p>

另外的问题是是否有一些很好的方法来进行这种验证?手动验证每条数据的存在似乎是一件令人头疼的事情。特别是对于更复杂的数据结构。

就在写这个问题的过程中,我想到了一个想法。我可以使用$.extend(),就像它通常用于在编写模块/插件时设置默认选项一样。比如:

$.post(settings.url, function(data) {
    var trustedStructure = $.extend({
        someData1:  $('#someElement').text(),
        someData2:  $('#someElement2').text(),
    }, data);

    $('#someElement').text(trustedStructure .someData1);
    $('#someElement2').text(trustedStructure .someData2);
});

这样我就可以将当前数据作为默认数据或任何其他数据作为可信数据。

编辑: 忘记注意了。我说的是纯 JSON 数据响应。不包括 HTML 等。

【问题讨论】:

  • @Andreas 是的,当然。这只是我写的一段代码,没有经过测试来展示我的想法,这部分是之前的 ctrl+c/v ;-)。
  • 如果你不相信它,绝对的。
  • @KevinB 我不相信自己的未来 ;-) 而且我想知道常见的方法是什么。

标签: javascript jquery ajax validation


【解决方案1】:

一般你不会验证响应数据,正如你之前所说,数据是从你自己的后端返回的。您真正需要做的是确保您有适当的方法来处理来自服务器的信息的异常或错误。

如果您从服务器返回异常,您应该在客户端有办法确定是否有错误。

即返回特定代码,如 Rest API 或具有如下 JSON 结构:

// Success
{
    "error": false,
    "data": {
       ...
    }
}
// Exception
{
    "error": true,
    "message": "Username already taken",
    "type": "warning"
}

如果你总是返回 200 OK 状态码:

$.ajax({
    ...
    success: function(response) {
        if (response.error) {
            alert(response.error.message);
        } else {
            document.querySelector('#field').value = response.data.text;
        }
    }
});

HTML 响应代码在您使用 promises 时很有用,您可以为主要流程(成功、完成)返回 200 OK,以及 4XX 或 5XX 如果发生异常情况(失败):

$.ajax({
    url: 'example.php',
    ...
})
.done(function(response) { alert(response.data); })    
.fail(function(error) { alert(error.message); })    
.always(function() { clearFields(); }); 

【讨论】:

    【解决方案2】:

    从您的服务器返回的数据是否包含 DOM 元素?

    如果不是并且是纯文本返回,您可以使用textarea 来解析传入的数据,如下所示:

    var textArea = document.createElement('textarea');
    textArea.innerHTML = data;
    data = textArea.textContent;
    

    试一试,让服务器发送一些<p><img><script>元素

    【讨论】:

    • 我忘了说。我的意思是响应是 JSON 对象。想要将特定属性放入特定的现有 DOM 元素中。无论如何,这只是一个示例,将来我可能还需要对返回的数据进行一些逻辑处理。
    • 在将它们插入 DOM 之前,您当然可以对这些单个属性使用该方法
    • 是的,但我有点想了解验证 JSON 对象结构本身。您知道,要检查是否存在特定属性。总的来说,它更多的是关于 JS 中的策略,而不是解决特定问题。
    • 啊,好的,我现在明白了。但在我看来,当您不检查每个 JSON 字段是否存在时,您似乎不会冒安全问题的风险。通常我希望传入的数据很好,并在必要的地方进行额外的检查(比如将来自 AJAX 调用的内容插入 DOM 时)
    • 没错,这就是我的大脑告诉我的。 ;-) 但另一方面,保护您的代码免受自己的侵害通常是值得的。 :) 以防万一当您破坏某些进行更改的内容(例如在服务器端)时更容易调试它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    相关资源
    最近更新 更多