gpt4 book ai didi

Java HttpURLConnection VS Android HttpURLConnection

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:38 27 4
gpt4 key购买 nike

我有这个在 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));
}

提供这些 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 上提供这些 header 的代码完全相同

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

我再也找不到内容长度 header 了。我错过了什么吗?

最佳答案

Android HttpURLConnection 正在为您透明地做一些魔术,例如缓存和 gzip 处理。

因此,如果您不设置Accept-Encoding: identity,HUC 将设置Accept-Encoding: gzip,deflate。由于 nginx 是一个智能的好东西,它可能会提供您的响应 gzip 编码。您没有告诉 HUC 将响应以 gzip 压缩的形式返回给您,但它会为您解压缩该响应并删除 header ,因为这会产生误导。

您可以将此视为节省带宽和 radio 功耗的强大功能,Android 程序员无需处理 gzipdeflate 编码。

如果您只是将响应流式传输到您的 JSON 解析器,您将获得正确大小的未压缩数据,尽管事先不知道大小。

您可以通过在服务器端运行 wiresharktcpdump 来验证我所说的内容,或者如果您有已获得 root 权限的 Android 设备,则有一些方法可以在客户端执行此操作

关于Java HttpURLConnection VS Android HttpURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22586614/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com