Java URL類踩坑指南(一)

背景介紹

最近再做一個RSS閱讀工具給自己用,其中一個環(huán)節(jié)是從服務(wù)器端獲取一個包含了RSS源列表的json文件晒屎,再根據(jù)這個json文件下載喘蟆、解析RSS內(nèi)容缓升。核心代碼如下:

class PresenterImpl(val context: Context, val activity: MainActivity) : IPresenter {
    private val URL_API = "https://vimerzhao.github.io/others/rssreader/RSS.json"

    override fun getRssResource(): RssSource {
        val gson = GsonBuilder().create()
        return gson.fromJson(getFromNet(URL_API), RssSource::class.java)
    }

    private fun getFromNet(url: String): String {
        val result = URL(url).readText()
        return result
    }

    ......
}

之前一直執(zhí)行地很好,直到前兩天我購買了一個vimerzhao.top的域名蕴轨,并將原來的域名vimerzhao.github.io重定向到了vimerzhao.top港谊。這個工具就無法使用了,但在瀏覽器輸入URL_API卻能得到數(shù)據(jù):

image

那為什么URL.readText()沒有拿到數(shù)據(jù)呢橙弱?

不支持重定向

可以通過下面代碼測試:

import java.net.*;
import java.io.*;

public class TestRedirect {
    public static void main(String args[]) {
        try {
            URL url1 = new URL("https://vimerzhao.github.io/others/rssreader/RSS.json");
            URL url2 = new URL("http://vimerzhao.top/others/rssreader/RSS.json");
            read(url1);
            System.out.println("=--------------------------------=");
            read(url2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void read(URL url) {
        try {
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(url.openStream()));

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

得到結(jié)果如下:

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
=--------------------------------=
{"theme":"tech","author":"zhaoyu","email":"dutzhaoyu@gmail.com","version":"0.01","contents":[{"category":"綜合版塊","websites":[{"tag":"門戶網(wǎng)站","url":["http://geek.csdn.net/admin/news_service/rss","http://blog.jobbole.com/feed/","http://feed.cnblogs.com/blog/sitehome/rss","https://segmentfault.com/feeds","http://www.codeceo.com/article/category/pick/feed"]},{"tag":"知名社區(qū)","url":["https://stackoverflow.com/feeds","https://www.v2ex.com/index.xml"]},{"tag":"官方博客","url":["https://www.blog.google/rss/","https://blog.jetbrains.com/feed/"]},{"tag":"個人博客-行業(yè)","url":["http://feed.williamlong.info/","https://www.liaoxuefeng.com/feed/articles"]},{"tag":"個人博客-學(xué)術(shù)","url":["http://www.norvig.com/rss-feed.xml"]}]},{"category":"編程語言","websites":[{"tag":"Kotlin","url":["https://kotliner.cn/api/rss/latest"]},{"tag":"Python","url":["https://www.python.org/dev/peps/peps.rss/"]},{"tag":"Java","url":["http://www.codeceo.com/article/category/develop/java/feed"]}]},{"category":"行業(yè)動態(tài)","websites":[{"tag":"Android","url":["http://www.codeceo.com/article/category/develop/android/feed"]}]},{"category":"亂七八遭","websites":[{"tag":"Linux-綜合","url":["https://linux.cn/rss.xml","http://www.linuxidc.com/rssFeed.aspx","http://www.codeceo.com/article/tag/linux/feed"]},{"tag":"Linux-發(fā)行版","url":["https://blog.linuxmint.com/?feed=rss2","https://manjaro.github.io/feed.xml"]}]}]}

HTTP返回碼301歧寺,即發(fā)生了重定向〖辏可在瀏覽器上這個過程太快以至于我們看不到這個301界面的出現(xiàn)斜筐。這里需要說明的是URL.readText()是Kotlin中一個擴展函數(shù),本質(zhì)還是調(diào)用了URL類的openStream方法蛀缝,部分源碼如下:

.....
/**
 * Reads the entire content of this URL as a String using UTF-8 or the specified [charset].
 *
 * This method is not recommended on huge files.
 *
 * @param charset a character set to use.
 * @return a string with this URL entire content.
 */
@kotlin.internal.InlineOnly
public inline fun URL.readText(charset: Charset = Charsets.UTF_8): String = readBytes().toString(charset)

/**
 * Reads the entire content of the URL as byte array.
 *
 * This method is not recommended on huge files.
 *
 * @return a byte array with this URL entire content.
 */
public fun URL.readBytes(): ByteArray = openStream().use { it.readBytes() }

所以上面的測試代碼即說明了URL.readText()失敗的原因顷链。
不過URL不支持重定向是否合理?為什么不支持屈梁?還有待探究嗤练。

歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流在讶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煞抬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子真朗,更是在濱河造成了極大的恐慌,老刑警劉巖僧诚,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遮婶,死亡現(xiàn)場離奇詭異,居然都是意外死亡湖笨,警方通過查閱死者的電腦和手機旗扑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慈省,“玉大人臀防,你說我怎么就攤上這事”甙埽” “怎么了袱衷?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笑窜。 經(jīng)常有香客問我致燥,道長,這世上最難降的妖魔是什么排截? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任嫌蚤,我火速辦了婚禮辐益,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脱吱。我一直安慰自己智政,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布箱蝠。 她就那樣靜靜地躺著续捂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抡锈。 梳的紋絲不亂的頭發(fā)上疾忍,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音床三,去河邊找鬼一罩。 笑死,一個胖子當著我的面吹牛撇簿,可吹牛的內(nèi)容都是我干的聂渊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼四瘫,長吁一口氣:“原來是場噩夢啊……” “哼汉嗽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起找蜜,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饼暑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洗做,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弓叛,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年诚纸,在試婚紗的時候發(fā)現(xiàn)自己被綠了撰筷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡畦徘,死狀恐怖毕籽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情井辆,我是刑警寧澤关筒,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站杯缺,受9級特大地震影響平委,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夺谁,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一廉赔、第九天 我趴在偏房一處隱蔽的房頂上張望肉微。 院中可真熱鬧,春花似錦蜡塌、人聲如沸碉纳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳曹。三九已至,卻和暖如春琅摩,著一層夾襖步出監(jiān)牢的瞬間铁孵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工房资, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜕劝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓轰异,卻偏偏與公主長得像岖沛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搭独,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 背景介紹 最近再做一個RSS閱讀工具給自己用婴削,其中一個環(huán)節(jié)是從服務(wù)器端獲取一個包含了RSS源列表的json文件,再...
    趙裕vimerzhao閱讀 400評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理牙肝,服務(wù)發(fā)現(xiàn)唉俗,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 常見試題 行內(nèi)元素:會在水平方向排列配椭,不能包含塊級元素虫溜,設(shè)置width無效,height無效(可以設(shè)置line-h...
    他大舅啊閱讀 2,432評論 1 5
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,320評論 7 249
  • 我不曾路過草原 讓蒙古包的笑靨 帶著遺憾 是否你們相遇的開端 像乳酪很甜 很溫暖 烙印在臉頰 不愛洗頭美麗的爛漫 ...
    爾兒閱讀 249評論 0 0