Http协议中的Content-Length属性

   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;

服务器端根据请求的文件名来返回相应文件的内容。

浏览器中的响应头

image

浏览器中响应头中没有Content-Length属性来说明数据的大小。但是有个Transfer-Encoding属性,它的作用是当传输数据的大小不确定时通过chunked(片)的方式进行传输。这种方式可以保证浏览器可以拿到全部的数据。但是在Android中就没有这么幸运。

XUtils插件

使用该插件时无法从服务器上获取完整的数据。服务器上发送的数据是完整的json数据,因为服务器端的日志显示是200代码,但是客户端并没有将所有数据全部拿到。客户端只拿到了部分数据,如下图所示

image

有Conent-Length属性

原文地址:https://www.cnblogs.com/xidongyu/p/5938888.html