Android開發的時候需要與從服務器上獲取數據,數據是通過http協議封裝的。Android端使用的是Xutils第三方插件來發起http請求,但是每次只能拿到部分數據。通過仔細分析后原來是Content-Length屬性的問題。Content-Length屬性是用來說明傳輸的正文大小。下面就仔細描述一個整個過程。
無Content-Length屬性
服務器端
<?php
$filePath = 'app/'.$_GET['item'];
header("Content-type: text/html; charset=utf-8");
$size = filesize($filePath);
$str = file_get_contents($filePath);
echo $str;
<?php $filePath = 'app/'.$_GET['item']; header("Content-type: text/html; charset=utf-8"); $size = filesize($filePath); $str = file_get_contents($filePath); echo $str;
服務器端根據請求的文件名來返回相應文件的內容。
瀏覽器中的響應頭
瀏覽器中響應頭中沒有Content-Length屬性來說明數據的大小。但是有個Transfer-Encoding屬性,它的作用是當傳輸數據的大小不確定時通過chunked(片)的方式進行傳輸。這種方式可以保證瀏覽器可以拿到全部的數據。但是在Android中就沒有這么幸運。
XUtils插件
使用該插件時無法從服務器上獲取完整的數據。服務器上發送的數據是完整的json數據,因為服務器端的日志顯示是200代碼,但是客戶端並沒有將所有數據全部拿到。客戶端只拿到了部分數據,如下圖所示