关于在 URL 参数中转义特殊字符的困惑

Confusion Regarding Escaping Special Characters in URL Parameters

背景:

我已经在这里阅读了几个问题的答案,但是我读得越多,它只会变得越混乱。

任务:

我需要在 URI 中发送一个带有 "trailing" 参数的 POST URL 请求,如下所示:

http://www.myhostname.com/functionName?parameter1=value1&parameter2=value2

通常,我会创建具有格式的参数字符串并为每个参数插入值,如下所示:

let value1 = "Hello"
let value2 = "World"

let parameterString = "?parameter1=\(value1)&parameter2=\(value2)"

let requestURL = baseURL.URLByAppendingPathComponent("\(fucntionName)\(parameterString)")

问题:

  1. 第一个参数前的“?”是否需要百分号转义?
  2. 我是否需要在每个后续参数之前对“&”进行百分号转义?
  3. 我是否需要对每个参数名称及其值之间的“=”进行百分号转义?
  4. 如果某些参数的值是带扩展名的文件名,我是否需要对“.”进行百分号转义?
  5. 我应该使用 URLQueryAllowedCharacterSet 转义,还是需要定义自定义字符集?

更新: 如果我使用 NSCharacterSet.URLQueryAllowedCharacterSet()print() 转义结果字符串,?=& 保持不变。如果我使用该字符串实例化一个 NSURL,然后打印它的 path 属性(即 String),我会得到相同的输出。

但是如果我按原样将 NSURL 实例传递给 print(),那么 ?单独获得百分比转义(进入 %3F)。

要创建包含 URL 的字符串,首先将 Base URL 与参数结合起来,然后使用 stringByAddingPercentEncodingWithAllowedCharacters 对其进行编码,然后仅将其转换为 URL, "? & = . /" 不应在 URL

中进行百分比转义
let escapedSearchText = searchText.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())!

let urlString = String(format:"%@/%@?parameter1=%@&parameter2=%@",hostName, functionName,value1, value2)
//http://www.myhostname.com/functionName?parameter1=value1&parameter2=value2

let url = NSURL(string: urlString)
return url!