5

Let's assume this is being executed in jQuery:

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

And ajaxcall.php contains:

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

echo json_encode($return_obj);
die();

I'm expecting the following situations to occur (due to packet loss, connection problems, etc):

  • Ajaxcall.php executes, but the $_POST variable is empty.
  • The promises of the $.ajax() call are executed, but the data returned to them is empty.

However, what I'm really worried about are situations like these:

  • Ajaxcall.php executes and $_POST['data']['txt'] has expected values but $_POST['data']['ary'] is missing some values.
  • The promises of the $.ajax() call are executed and data.ary has the expected values, but data.txt is only half a string (e.g., "ok t").

Are these situations possible?

4

3 回答 3

4

简而言之:不,这是不可能的。HTTP 基于 TCP,它保证数据的传递。服务器和客户端都会意识到会导致某些数据丢失的问题。TCP 层将根据需要重新传输数据,直到完成。

丢包和乱序交付在互联网上并不少见,因为没有规定路由器必须转发所有数据包,但 TCP 会自动纠正这些问题。

于 2013-07-18T21:01:26.013 回答
2

这些情况都不应该发生。

数据包丢失在协议栈的较低级别进行管理。

在互联网上,TCP负责每个数据包的完整性,并确保所有数据包以正确的顺序正确到达。

在更高级别的协议栈上,HTTP有一个名为的响应头Content-Length,它告诉浏览器返回内容的大小,浏览器使用它来确保响应是完整的。

不过,一些 HTTP 请求可以用一个无用的Transfer-Encoding: chunked标头来回答。Content-Length这些是持久连接,并且在事先不知道内容的长度时使用。

您是否有任何到达时数据不完整的示例?

于 2013-07-18T21:14:15.773 回答
0

我不确定我是否真的理解您的问题,但是如果响应以某种方式被截断(但返回 - 即服务器仍然以 200 状态响应),它将不是有效的 JSON。

您的问题尚不清楚data.txt“只有一个字符串”如何仍然有效。

于 2013-07-18T21:00:37.083 回答