部分JSON传输

时间:2018-08-06 19:25:59

标签: javascript php json api

我目前在PHP中有一个API,可以传输JSON数据。然后由Javascript网页读取它并处理数据。但是,有时数据集可能会很大,这会给用户的Internet和他们的PC处理数据造成负担。我想将结果计数与数据一起发送,可以在完成下载之前读取。

我成功地将计数添加到标题中,但是我被告知制作自定义标题是一个很大的不。

我能够做到的另一种方法是设置SESSION变量,然后向另一个获取SESSION值的PHP文件发出第二个请求。但是,有时第二个请求可能要花一些时间,并且计数显示得很晚。

是否可以在不使用标头的情况下在发送数据之前发送有关要处理的数据的信息,并可以被Javascript读取?这是我当前的代码:

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = sizeof($results);

$final_string = json_encode($results);
$size = mb_strlen($final_string, '8bit');

header('Content-Length: '.$size);
header('Content-Range: 0'); // Content-Length header is dropped unless this is set.

echo $final_string;

2 个答案:

答案 0 :(得分:0)

我发现我可以使用XHR事件侦听器读取部分传输内容。然后,我可以将计数附加到传输的开头,以便首先使用正则表达式匹配项来读取该计数。

PHP

$return_data = [
    "count" => sizeof($results),
    "results" => $results,
  ];

$final_string = json_encode($return_data);

header('Content-Length: '.mb_strlen($final_string, '8bit'));
header('Content-Range: 0'); // Content-Length header is dropped unless this is set.
echo $final_string;

PHP输出

{"count":104,"results":[ {"id":"28078", ...

Javascript

function xhrLoadingCall() {

    let xhr = new window.XMLHttpRequest();
    // Download progress
    xhr.addEventListener("progress", function(evt){
        setDownloadProgressAmount(evt);
    }, false);


    return xhr;
}


function setDownloadProgressAmount(event){

    if(resultsCount === null){
        let partialData = event.currentTarget.response;
        let regexMatch = partialData.match(/"count"\s*:\s*(\d+)/);
        if(regexMatch !== null)
        {
            resultsCount = parseInt(regexMatch[1]);
            // do something with result
        }
    }
}

$.ajax({
    xhr : xhrLoadingCall,
    // ...
})

答案 1 :(得分:-1)

发送自定义标头有什么问题?

海事组织没有错。 如果您不想使用自定义标头,则可以使用单独的调用来返回数据的长度。