簡體   English   中英

Java HttpURLConnection VS Android HttpURLConnection

[英]Java HttpURLConnection VS Android HttpURLConnection

我有這個在Windows VM上運行的簡單代碼:

URL url = new URL("http:xxx.xxx.xxx.xxx/api/cities.json");
HttpURLConnection connexion = (HttpURLConnection) url.openConnection();
connexion.setRequestMethod("GET");

System.out.println("response " + connexion.getResponseCode());
connexion.connect();

InputStream is = connexion.getInputStream();

for (String header : connexion.getHeaderFields().keySet()) {
    System.out.println(header + ":" + connexion.getHeaderField(header));
}

給這些標題

response 200
null:HTTP/1.1 200 OK
X-Frame-Options:SAMEORIGIN
Access-Control-Allow-Origin:*
Vary:Accept-Encoding
Date:Sun, 23 Mar 2014 03:00:06 GMT
Content-Length:1894
Connection:keep-alive
Content-Type:application/json
Server:nginx

Android上的完全相同的代碼提供了這些標題

03-22 23:10:35.405: I/System.out(23707): null:HTTP/1.1 200 OK
03-22 23:10:35.405: I/System.out(23707): Access-Control-Allow-Origin:*
03-22 23:10:35.405: I/System.out(23707): Connection:keep-alive
03-22 23:10:35.405: I/System.out(23707): Content-Type:application/json
03-22 23:10:35.405: I/System.out(23707): Date:Sun, 23 Mar 2014 03:10:35 GMT
03-22 23:10:35.405: I/System.out(23707): Server:nginx
03-22 23:10:35.405: I/System.out(23707): Vary:Accept-Encoding
03-22 23:10:35.405: I/System.out(23707): X-Android-Received-Millis:1395544235409
03-22 23:10:35.405: I/System.out(23707): X-Android-Response-Source:NETWORK 200
03-22 23:10:35.405: I/System.out(23707): X-Android-Selected-Transport:http/1.1
03-22 23:10:35.405: I/System.out(23707): X-Android-Sent-Millis:1395544235363
03-22 23:10:35.405: I/System.out(23707): X-Frame-Options:SAMEORIGIN

我再也找不到內容長度的標題了。 我錯過了什么?

Android HttpURLConnection為您提供了一些透明的功能,如緩存和gzip處理。

因此,如果您未設置Accept-Encoding: identity ,HUC會設置Accept-Encoding: gzip,deflate 因為nginx是一個聰明的好東西,它可能會提供你的響應gzip編碼。 你沒有告訴HUC把回復給你回復,但它會為你解壓縮這個回復並刪除標題,因為這是誤導。

你可以看到這是一個強大的功能,可以節省帶寬和無線電功耗,而Android程序員不必處理gzipdeflate編碼。

如果您只是將響應流式傳輸到JSON解析器,您將獲得正確大小的未壓縮數據,但事先不知道大小。

您可以通過運行wiresharktcpdump服務器端來驗證我所說的內容,或者如果您有一個有根的Android設備,那么也有辦法在客戶端執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM