关于 HttpURLConnection 的一个奇怪问题

2015-09-25 02:02:29 +08:00
 aa45942

不知道是不是有人碰到过,用 HttpURLConnection 类提交 GET 请求,获取不到响应状态码

URL url = new URL(URL_ADDR);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_ACCEPTED) {
    ...
}
...

debug 的时候发现其实已经收到回复,但不知为何 header 没有 HTTP/1.1 这行,第一行是 Date ,导致 conn.getResponseCode()一直返回-1
不得已把

if (conn.getResponseCode() == HttpURLConnection.HTTP_ACCEPTED)

改成

if (conn.getResponseCode() == HttpURLConnection.HTTP_ACCEPTED) || conn.getHeaderField(0) != null)

发现运行结果是正确的(也就是说仅仅是没获取到正确的响应状态码)

编译工具为 Android Studio 1.3.2 , API 22/23 , AVD 与真机调试均失败

有谁知道是什么问题么

PS : URL_ADDR 是地址,我用 curl 试过,能获取到正常的 http 头,换成其他地址也是一样的结果

10730 次点击
所在节点    Android
14 条回复
cnnblike
2015-09-25 08:27:25 +08:00
我个人的建议说了你肯定要打我……我的建议是:用 HttpClient 。比 HttpURLConnection 不知道好用到哪里去了。
以及,任何出现问题的情况,先用 WireShark 抓包,接着读源码,逐行 debug 。
ljbha007
2015-09-25 08:48:25 +08:00
@cnnblike 谷歌之前也是鼓励使用 httpclient 但是 2.3 之后因为 api 变动和性能问题 不鼓励开发者使用 HttpClient 了 如果非要使用最好使用 AndroidHttpClient

http://android-developers.blogspot.jp/2011/09/androids-http-clients.html
ljbha007
2015-09-25 08:52:13 +08:00
@cnnblike 另外 Square 家的 okhttp 也很不错 http://square.github.io/okhttp/
holmesabc
2015-09-25 09:40:06 +08:00
HttpURLConnection 用起来是很烦碎的。
由于 6.0 开始把 httpclient 费了, 最好就是直接转 okhttp
KoleHank
2015-09-25 10:23:01 +08:00
URL_ADDR 是自己的站点还是国外的?我曾经因为墙的问题,用 HttpURLConnection 访问国外的一个 api 死活就是得不到正确的结果的情况。
弄一点测试代码到国外的 vps 上面测试了一下,结果就能正常访问了。
cnnblike
2015-09-25 14:55:35 +08:00
@ljbha007 性能问题感觉没什么大不了的吧,除非你每秒几百个链接,不然哪来的性能问题……速度慢和更慢之间的差距用户根本不大可能体会出来。不过 httpclient 确实有点笨重了,我去看看 okhttp 哈~
顺便好奇怪,你我都没互相 Block ,我怎么就没收到你的 @ 呢?奇怪了
aa45942
2015-09-25 15:48:25 +08:00
@cnnblike httpclient 已经被干掉。源码没问题,抓包没问题, debug 看就缺了响应状态码

@KoleHank 那个地址国内国外都试过,百度网易也试过,就是得不到正确结果
ljbha007
2015-09-25 15:57:05 +08:00
@aa45942 @cnnblike

原来已经被废了

@不到应该是因为我被管理员拉黑了吧 我发帖都要给我强行+ 4 小时时间 这样永远上不了首页
Droog
2015-09-25 19:58:01 +08:00
@ljbha007 httpclient 被干掉是什么意思? 6.0 以后即使在 apache 上下载的也用不了?
aa45942
2015-09-25 20:26:24 +08:00
@Droog 就是说这个东西已经没有了
jeremaihloo
2015-09-25 21:11:02 +08:00
不都在用 okhttp 了吗,其他两个不推荐用了吧
aa45942
2015-09-25 21:23:22 +08:00
@jeremaihloo 这不是项目上的代码,只是我单纯拿来玩的,所以用哪个都无所谓,但出现了这个现象,然后想知道问题出在哪
ljbha007
2015-09-25 22:00:57 +08:00
@Droog 只能自己用 maven 依赖了 原生没有了
snnn
2015-09-30 13:15:08 +08:00
@jeremaihloo okhttp 不支持 ntlm 。而我需要用 ntlm 。唉……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/223505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX