好长时间没有写博客,一是前段时间太忙,二是最近在看一些机器学习方面的内容。
其实在刚开始接触http 1.1协议的时候就了解了这个属性(chunked) ,只是当时并为太在意,直到前段时间工作上的一次偶然的机会让我重新思考了一遍这个属性。
先看一段代码:
URL url = new URL("http://127.0.0.1:8080/qqqq/tests");
URLConnection rulConnection = url.openConnection();
HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setDoInput(true);
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
httpUrlConnection.setRequestMethod("GET");
//httpUrlConnection.setChunkedStreamingMode(2); //如果不设置这个属性,那么http请求是一次性将全部内容发出去的,如果设置了,那么就会对请求体内容进行分段,大小为2字节,依次进行发送,也就是chunked模式
OutputStream outStrm = httpUrlConnection.getOutputStream();
DataOutputStream out = new DataOutputStream(outStrm);
String content = "firstname=" + URLEncoder.encode("一个人", "utf-8");
out.writeBytes(content);
out.flush();
out.close();//在执行这句的时候http的整个请求会一次性发给服务器
int responseCode = httpUrlConnection.getResponseCode();//如果没有上面的那一句,调用这一句也会把请求发送出去
上面注释提到了chunked模式,这需要web的服务器的支持,其实这在我的工作中主要解决了大数据上传过程中内存溢出问题(在手机端)。
如果在http头中存在chunked属性,那么content-length属性将不会再发挥作用,那么客户端在在发送内容结尾处会发送一个长度为0的块来标示着此次请求内容结束。