http協議Chunked transfer encoding
阿新 • • 發佈:2019-01-06
好長時間沒有寫部落格,一是前段時間太忙,二是最近在看一些機器學習方面的內容。
其實在剛開始接觸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的塊來標示著此次請求內容結束。