簡體   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