繁体   English   中英

我应该在jQuery的ajax成功处理程序中验证响应数据吗?

[英]Should I validate response data in jQuery's ajax success handler?

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

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

我是一个后端开发人员,我自然需要对来自用户的任何数据进行服务器端验证。 尽管情况恰恰相反,但是上面的代码对我来说还是有点错误(未经验证的外部数据)。 但是另一方面,我知道我要从服务器返回什么。

现在的问题是,如果是罚款 ,相信data从(也是我)返回后端应用程序将有预期的结构,或者我应该以某种方式验证每数据来服务器?

另一个问题是是否有一些不错的方法来进行这种验证? 手动验证每条数据的存在似乎让人头疼。 特别是对于更复杂的数据结构。

在写这个问题的过程中,我想到了一个主意。 我可以使用$.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等。

通常,您不验证响应数据,如前所述,数据是从您自己的后端返回的。 您真正需要做的是确保使用正确的方法来处理来自服务器的信息中的异常或错误。

如果要从服务器返回异常,则应在客户端提供一种方法来确定是否发生错误。

例如,返回诸如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;
        }
    }
});

当使用promises时 ,HTML响应代码很有用,您可以为主要流程返回200 OK (成功,完成),如果发生异常(失败),则返回4XX5XX

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

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

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

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

只需尝试一下,然后让服务器发送一些<p><img><script>元素

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM