Google CSE的NSURLQueryItem百分比编码错误

时间:2016-09-03 08:26:45

标签: swift nsurlrequest percent-encoding

我正在使用Google custom search engine撰写应用。

我收到了我的搜索引擎ID XXXXXXXX21914382657 1:7 h9XXXXXXX (最有趣的部分是粗体)。

现在我正在尝试使用NSURLQueryItem通过使用以下方法将我的ID嵌入到URL中:

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

它应该是百分比转义项 XXXXXXXX21914382657 1%3A 7h9XXXXXXX (这个值是我在测试时使用Google API资源管理器时得到的,它显示了使用的网址连衣裙)。它不是这样做的。我没有逃脱,没有变化的网址。如果我在此映射中使用转义字符串作为引擎ID,我将获得转义字符串 XXXXXXXX21914382657 1%253A 7h9XXXXXXX (在查询中添加了额外的“25”)。

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

编辑:

我正在使用app Info.plist来保存ID,我通过调用它来检索它:

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

1 个答案:

答案 0 :(得分:1)

冒号是允许在URL字符串的查询部分。应该没有必要逃脱它们。

严格地说,在URL的那一部分中唯一必须编码的是&符号,哈希标记(#)和(假设您正在使用表单编码进行GET查询)等于符号。然而,理论上的问号可能会引起问题,技术上不允许斜线(但工作得很好),技术上允许使用分号(但在实践中也是如此)。

Colons,AFAIK,在路径上下文中只有特殊含义(如果操作系统将其视为路径分隔符),并且它将方案(协议)与URL的其余部分分开。

所以不要担心冒号会被解除编码,除非谷歌API因为某些原因而被禁止。