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

Android 中的废物 HttpURLConnection

  •  
  •   xiangyuecn · 2019-05-27 21:36:06 +08:00 · 9495 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    姐妹篇 : /t/487915 : C#中的废物 WebRequest

    没想到 Android 中想发一个超级简单 http 请求也这么废:

    http 可以自动 30x 跳转到 http

    https 可以自动 30x 跳转到 https

    http 不可以自动 30x 跳转到 https 反之亦然

    没有一个省心的。害得我试了半天 setInstanceFollowRedirects、setFollowRedirects,看样子要全部干掉,自己实现 30x 跳转逻辑。

    搜到几篇针对这个问题的解释文章:jianshu /p/bb9ad9b8720f、blog? /alexmofer/article/details/52790486


    如果要支持跳转,这不应该是核心的功能吗????

    如果是不支持还没话可说,但这玩意尽特么挖坑😒😒😒

    😒😒😒

    😒😒😒

    9 条回复    2019-05-27 23:02:50 +08:00
    nicevar
        1
    nicevar  
       2019-05-27 22:28:20 +08:00
    一个简单的 http 跳转至于么,喷之前先把文档看了,然后写代码调试一下,免得自己是废物还不知道
    另外告诉你 HttpURLConnection 与 Android 没啥关系,它是 java 库里面的
    xiangyuecn
        2
    xiangyuecn  
    OP
       2019-05-27 22:48:07 +08:00
    @nicevar 被你一样看穿了😁 刚特意翻译了一下 HttpURLConnection 这个类的注释,里面确实写了 `http 不会跳转到 https 反之亦然`。不是不看文档,只是出现这种问题的时候往往难以找到能快速解决问题的位置。

    针对这样的低级、另类的缺陷,喷一喷也无妨。妄想想通过寥寥数笔的注释把底层的无能转嫁给上层的开发者,这是难以理解的。

    在没有因为这个问题而产生问题的时候,估计很少有开发者在用到 HttpURLConnection 时候会关注到这个问题。

    但这锅是 Android 还是 java 的,我不知道,目测 Android 的锅可能性比较大。
    xiangyuecn
        3
    xiangyuecn  
    OP
       2019-05-27 22:48:58 +08:00
    @nicevar 被你一眼看穿了,打错了一个字
    winterbells
        4
    winterbells  
       2019-05-27 22:53:38 +08:00
    我记得当时怎么都接收不了响应,调了半天。最后才知道错误的时候是从 getErrorStream 拿。。。。
    dobelee
        5
    dobelee  
       2019-05-27 22:54:24 +08:00 via Android
    这不是 java 的 http 库吗?跟 Android 有毛关系...
    这也不是什么底层缺陷。
    luckylo
        6
    luckylo  
       2019-05-27 22:55:28 +08:00 via Android
    你已经发现了问题,只不过解决问题的方式不对。当然,大部分都是 Google 程序员,相信 Google 这个问题,会有人提到注释
    luckylo
        7
    luckylo  
       2019-05-27 22:57:01 +08:00 via Android
    @winterbells 我前天看了 spring RestTemplate 的部分源代码,才知道 jdk8 开始,delete 请求要特殊处理下
    luckylo
        8
    luckylo  
       2019-05-27 23:02:31 +08:00 via Android
    @luckylo 错了,是 jdk 8 以前。
    xiangyuecn
        9
    xiangyuecn  
    OP
       2019-05-27 23:02:50 +08:00
    @dobelee #5 看起来像 java 的库,但我看 https://www.jianshu.com/p/bb9ad9b8720f 里面的解释,发帖子的时候就把锅甩给了 Android,抄录一段:

    ““““
    然后 google 了一下,从回答中探索答案,发现 HttpURLConnection 从 Android 5.0 后其 http 和 https 是使用 okHttp 实现的,引用作者的回答:

    ......

    根据上边英文,我们知道 Android 重新导出了新的 jar,jar 中将 com.squareup 这两级目录改成 com.android。所以我们直接找 com.squareup.okhttp.HttpsHandler,在源码中果真找到了改 java 文件:
    ”””

    可以发现他记录的 HttpURLConnection 底层实现会根据 Android 版本不同而不同,因此 Android 的锅可能性比较大。

    ============

    另外“底层”算是一个相对概念吧,我们上面在写业务代码,用到了 Android 里面的东西,那么那些东西应该就算底层了吧,我是这样理解的。

    ============

    这是一个缺陷(至少我现在用到的语言中,只发现 Android 里面有这个问题)。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 21:40 · PVG 05:40 · LAX 13:40 · JFK 16:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.