【问题标题】:If jQuery AJAX data is sent/received, is it possible to only receive SOME of the data?如果发送/接收 jQuery AJAX 数据,是否可以只接收部分数据?
【发布时间】:2013-07-18 00:13:36
【问题描述】:

假设这是在 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
});

而 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() 调用的 Promise 已执行,但返回给它们的数据是空的。

但是,我真正担心的是这样的情况:

  • Ajaxcall.php 执行并且 $_POST['data']['txt'] 具有预期值,但 $_POST['data']['ary'] 缺少一些值。
  • $.ajax() 调用的 Promise 已执行,并且 data.ary 具有预期值,但 data.txt 只是半个字符串(例如,“ok t”)。

这些情况可能吗?

【问题讨论】:

  • 这意味着 PHP 代码做错了——要么错误地编码 JSON 错误(但更可能的数据不是预期的),要么返回成功标头并过早终止流(这会产生无效的 JSON )。 jQuery AJAX 的成功回调在成功所有数据传输后调用。
  • 是的 - 打开浏览器调试器 NETWORK 面板并查看返回的响应。查看响应是否格式错误或不完整。

标签: php jquery ajax json


【解决方案1】:

这些情况都不应该发生。

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

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

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

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

你有没有到达时数据不完整的例子?

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 2012-09-14
        • 2019-02-17
        • 2011-05-28
        • 1970-01-01
        相关资源
        最近更新 更多