【问题标题】:Java: handling webcal protocolJava:处理 webcal 协议
【发布时间】:2013-04-12 09:51:20
【问题描述】:

我正在尝试下载(甚至只是打开一个流)到位于 webcal://www.somewhere.com/foo?etc=bar 的日历。

当我这样做时,Java URL 类抛出“未知协议:webcal”异常:

URL url = new URL("webcal://...");

我如何告诉 URL 类它应该只使用 HTTP 作为传输协议,即使 Web 资源位于 webcal:// 协议后面的某个位置?

或者,无论如何,我怎样才能下载我的日历?

请记住,如果我尝试将“webcal://”替换为“http://”,我正在调用的网络服务器不会为日历提供服务。

【问题讨论】:

  • 如果你只想把它当作http,为什么不直接修复URL呢?
  • @JonSkeet 看问题的最后一句话
  • 啊,误读为“确实”。在这种情况下,听起来可能只是使用 HTTP 作为传输协议的情况。您需要真正了解 webcal 的东西。如果您只是稍微更改 URL 的其余部分,您确定它不起作用吗,例如最后添加一个固定的文件名?我建议您使用 Wireshark 之类的工具来查看正常工作的客户端会发生什么。
  • 不,我怀疑这只是运输问题。我会尽快发布答案
  • 还在等待你承诺的答案吗?

标签: java http url protocols webcal


【解决方案1】:

据我了解,苹果对“webcal”的使用确实只是“http”的同义词;所以它应该可以工作。

【讨论】:

    【解决方案2】:

    “webcal://”是一个非官方的 URI 方案,参见 Wikipedia article

    因此,它可能代表一种或另一种后端实现 - 例如。您正在调用的 Web 服务器可能正在使用任何上述协议实现,例如 WebDAVCalDAVOpenDAV

    但是,如果您只想读取文件的内容,那么任何 HTTP 客户端都应该这样做,因为上述协议是基于 HTTP 的。

    这是一个关于如何使用 URL 自己的打开 HttpURLConnection 的机制来读取远程 iCal 的示例:

        URL calendarURL = new URL("http://www.facebook.com/ical/b.php?uid=myUID&key=myKEY");
        URLConnection connection = calendarURL.openConnection();
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        while (reader.ready()) {
            System.out.println(reader.readLine());
        }
    

    如您所见,我已将原始 URL 更改为

    webcal://www.facebook.com/ical/b.php?uid=MYUID&key=MYKEY

    http://www.facebook.com/ical/b.php?uid=MYUID&key=MYKEY

    ,因为我们使用 java.net.URL 并且默认情况下 Java 不识别此协议。如果确实要联系的 Web 服务器仅通过 webcal:// 提供内容,那么您可能需要使用适当的客户端(基于服务器使用的确切协议实现)。例如,有大量框架提供 WebDAV 客户端功能,例如JackRabbitSardine 等。

    如果您提供有关服务器类型的更多信息,我们可以进一步挖掘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2011-09-10
      • 2016-05-22
      相关资源
      最近更新 更多