2013-07-18 47 views
5

讓我們假設這是jQuery中執行:如果發送/接收jQuery AJAX數據,是否有可能只接收一些數據?

$.ajax({ 
    url : 'ajaxcall.php', 
    data : { 'data' : { ary : [1,2,3,3,4,5], txt : "ima let u finish" } }, 
    dataType : 'json', 
    type : 'post', 
    timeout : 10000 
}); 

而且ajaxcall.php包含:

$return_obj = array(); 
$return_obj['ary'] = array(9,8,7,6,5); 
$return_obj['txt'] = "ok then"; 

echo json_encode($return_obj); 
die(); 

我期待下面的情況發生(由於數據包丟失,連接問題等):

  • Ajaxcall.php執行,但$ _POST變量爲空。
  • 執行$ .ajax()調用的承諾,但返回給它們的數據爲空。

不過,我真的很擔心這樣的情形這樣的:

  • Ajaxcall.php執行和$ _ POST [ '數據'] [ 'TXT']已預期值,但$ _ POST [ 'data'] ['ary']缺少一些值。
  • 執行$ .ajax()調用的承諾,並且data.ary具有期望值,但data.txt只有一半字符串(例如「ok t」)。

這些情況可能嗎?

+0

這意味着PHP代碼做錯了 - 要麼錯誤地編碼錯誤的JSON編碼(但更可能不希望數據)或返回成功標題並提前終止流(應該產生無效的JSON)。 jQuery AJAX成功的回調函數* * *在所有數據被傳輸後調用成功*。 – user2246674

+0

是的 - 打開瀏覽器調試器網絡面板,並查看回應。查看回復是否格式不正確或不完整。 –

回答

4

總之:不,這是不可能的。 HTTP基於保證數據交付的TCP。服務器和客戶端都會意識到會導致某些數據丟失的問題。 TCP層將根據需要重新發送數據,直到完成爲止。

因爲沒有規定路由器必須轉發所有數據包,但TCP會自動糾正這些問題,所以數據包丟失和亂序傳送並不少見。

+0

謝謝你提供一個非常簡潔明瞭的答案。 – EleventyOne

0

我不確定如果我真的理解你的問題,但是如果響應以某種方式被截斷(但返回 - 即服務器仍然響應200狀態確定)它將不是有效的JSON。

從您的問題中不清楚data.txt可能'只有一個字符串',但仍然有效。

2

這些情況都不會發生。

數據包丟失在協議棧的較低級別進行管理。

通過互聯網,TCP負責每個數據包的完整性,並確保所有數據包以正確的順序到達。

在協議棧的更高層,HTTP有一個響應標頭叫做Content-Length,它告訴瀏覽器返回內容的大小,瀏覽器使用它來確保響應完成。

儘管如此,一些HTTP請求可以通過Transfer-Encoding: chunked標頭來回答,這使得Content-Length無用。這些是持久連接,並且在內容的長度事先不知道時主要使用。

您是否有任何案例數據在抵達後不完整?