自定义URL方案作为现有URL方案的适配器

时间:2013-12-27 20:32:54

标签: java url nsurl nsurlprotocol

是否有一种干净且符合规范的方法来定义自定义URL方案,该方案在另一个URL返回的资源上充当适配器?

我已经定义了一个自定义URL协议,它返回本地文件的解密表示。所以,例如,在我的代码中,

decrypted-file:///path/to/file

透明地解密您从file:///path/to/file获得的文件。但是,这仅适用于本地文件。没有什么好玩的!我希望URL规范允许一种干净的方式,我可以通过将新的URL方案定义为现有URL上的一种适配器来概括它。

例如,我是否可以定义一个自定义URL方案decrypted:,它可以用作前缀另一个检索资源的绝对URL的适配器?然后我就可以了

decrypted:file:///path/to/file

decrypted:http://server/path/to/filedecrypted:ftp://server/path/to/file或其他。这将使我的decrypted:协议与所有进行文件检索的现有URL方案组合在一起。

Java使用jar: URL方案做类似的事情但是从我对RFC 3986的阅读中看来,这种Java技术似乎违反了URL规范。嵌入式网址未进行正确的字节编码,因此嵌入网址中的任何/?#分隔符都应正式视为嵌入网址中的细分分隔符(即使是不是JarURLConnection所做的。我希望保持在规格范围内。

有一个很好的正确的方法吗?或者是对整个嵌入式URL进行字节编码的唯一选择(即decrypted:file%3A%2F%2F%2Fpath%2Fto%2Ffile,这不是很好)?

我建议(URL适配器)在其他地方完成吗?或者是否有更深层次的原因导致误导?

1 个答案:

答案 0 :(得分:0)

Cocoa中没有内置适配器,但是对于大多数用途来说,使用NSURLProtocol编写自己的适配器非常简单。给定一个任意URL,对它进行编码似乎最简单:

myscheme:<originalurl>

例如:

myscheme:http://example.com/path

最简单的说,NSURL实际上只关心你传入的字符串是否是一个有效的URI,如上所述。是的,然后根据RFC 1808等在顶层提供额外的URL支持,但这不是必需的。

所有需要作为有效URI的是一个用于表示方案的冒号,并且没有无效字符(基本上是没有空格的ASCII)。

然后,您可以使用-resourceSpecifier方法检索原始网址并使用该网址。