V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aa45942
V2EX  ›  Android

关于 HttpURLConnection 的一个奇怪问题

  •  1
     
  •   aa45942 · 2015-09-25 02:02:29 +08:00 · 10655 次点击
    这是一个创建于 3348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道是不是有人碰到过,用 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 头,换成其他地址也是一样的结果

    14 条回复    2015-09-30 13:15:08 +08:00
    cnnblike
        1
    cnnblike  
       2015-09-25 08:27:25 +08:00
    我个人的建议说了你肯定要打我……我的建议是:用 HttpClient 。比 HttpURLConnection 不知道好用到哪里去了。
    以及,任何出现问题的情况,先用 WireShark 抓包,接着读源码,逐行 debug 。
    ljbha007
        2
    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
        3
    ljbha007  
       2015-09-25 08:52:13 +08:00
    @cnnblike 另外 Square 家的 okhttp 也很不错 http://square.github.io/okhttp/
    holmesabc
        4
    holmesabc  
       2015-09-25 09:40:06 +08:00
    HttpURLConnection 用起来是很烦碎的。
    由于 6.0 开始把 httpclient 费了, 最好就是直接转 okhttp
    KoleHank
        5
    KoleHank  
       2015-09-25 10:23:01 +08:00
    URL_ADDR 是自己的站点还是国外的?我曾经因为墙的问题,用 HttpURLConnection 访问国外的一个 api 死活就是得不到正确的结果的情况。
    弄一点测试代码到国外的 vps 上面测试了一下,结果就能正常访问了。
    cnnblike
        6
    cnnblike  
       2015-09-25 14:55:35 +08:00
    @ljbha007 性能问题感觉没什么大不了的吧,除非你每秒几百个链接,不然哪来的性能问题……速度慢和更慢之间的差距用户根本不大可能体会出来。不过 httpclient 确实有点笨重了,我去看看 okhttp 哈~
    顺便好奇怪,你我都没互相 Block ,我怎么就没收到你的 @ 呢?奇怪了
    aa45942
        7
    aa45942  
    OP
       2015-09-25 15:48:25 +08:00
    @cnnblike httpclient 已经被干掉。源码没问题,抓包没问题, debug 看就缺了响应状态码

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

    原来已经被废了

    @不到应该是因为我被管理员拉黑了吧 我发帖都要给我强行+ 4 小时时间 这样永远上不了首页
    Droog
        9
    Droog  
       2015-09-25 19:58:01 +08:00 via iPhone
    @ljbha007 httpclient 被干掉是什么意思? 6.0 以后即使在 apache 上下载的也用不了?
    aa45942
        10
    aa45942  
    OP
       2015-09-25 20:26:24 +08:00
    @Droog 就是说这个东西已经没有了
    jeremaihloo
        11
    jeremaihloo  
       2015-09-25 21:11:02 +08:00 via Android
    不都在用 okhttp 了吗,其他两个不推荐用了吧
    aa45942
        12
    aa45942  
    OP
       2015-09-25 21:23:22 +08:00
    @jeremaihloo 这不是项目上的代码,只是我单纯拿来玩的,所以用哪个都无所谓,但出现了这个现象,然后想知道问题出在哪
    ljbha007
        13
    ljbha007  
       2015-09-25 22:00:57 +08:00
    @Droog 只能自己用 maven 依赖了 原生没有了
    snnn
        14
    snnn  
       2015-09-30 13:15:08 +08:00
    @jeremaihloo okhttp 不支持 ntlm 。而我需要用 ntlm 。唉……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2909 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:28 · PVG 22:28 · LAX 06:28 · JFK 09:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.