Google CSE 的 NSURLQueryItem 百分比编码错误

Wrong NSURLQueryItem percentage encoding for Google CSE

我正在使用 Google custom search engine 编写应用程序。

我收到了我的搜索引擎 ID XXXXXXXX219143826571:7h9XXXXXXX(最有趣的部分加粗)。

现在我正在尝试使用 NSURLQueryItem 将我的 ID 嵌入到 URL 中,方法是:

let params = ["cx" : engineID,...]
...
components.queryItems = parameters.map {
    NSURLQueryItem(name: String([=11=]), value: String())
}

它应该将项目百分比转义为 XXXXXXXX219143826571%3A7h9XXXXXXX(我在使用 Google 时得到的这个值APIs 资源管理器在测试时显示 url 使用过的衣服)。它没有这样做。我得到 url 没有转义,没有变化。如果我在此映射中使用转义字符串作为引擎 ID,我将得到转义字符串 XXXXXXXX219143826571%253A7h9XXXXXXX(添加了额外的“25”查询)。

有人可以告诉我如何解决吗?我不想使用 String 然后通过 NSURL(string: str)! 将其转换为 URL。不优雅。

编辑:

我正在使用应用程序 Info.plist 保存 ID,我通过调用以下方式检索它:

String(NSBundle.mainBundle().objectForInfoDictionaryKey("ApiKey")!)

URL 字符串的查询部分允许使用冒号。应该没有必要逃避他们。

严格来说,在 URL 的那部分绝对必须编码的只有 & 符号、散列标记 (#) 和(假设您正在使用表单编码执行 GET 查询)等于符号。然而,理论上的问号可能会导致问题,斜线在技术上是不允许的(但工作得很好),分号在技术上是允许的(但同样,在实践中工作)。

冒号,AFAIK,仅在路径上下文中具有特殊含义(如果 OS 将其视为路径分隔符)并且它将方案(协议)与 [= 的其余部分分开21=].

所以不用担心冒号未编码,除非 Google API 出于某种原因 barfs。