如果您将要添加到URL中的值可能包含保留字符(由
RFC 3986第2节定义),则您可能需要重新调整百分号转义。值得注意的是,虽然
&
和
+
是URL中有效的字符,但它们不在URL查询参数值内有效(因为
&
用作查询参数之间的分隔符,会过早终止您的值,而
+
会被转换为空格字符)。不幸的是,标准的百分号转义会使这些分隔符未转义。
因此,您可能希望对不在RFC 3986未保留字符列表中的所有字符进行百分号转义:
URI中允许但没有保留目的的字符称为未保留字符。这些包括大写字母、小写字母、十进制数字、连字符、句点、下划线和波浪号。
未保留字符 = ALPHA / DIGIT /“-” /“.” /“_” /“~”
在第3.4节中,RFC进一步考虑将
?
和
/
添加到查询中允许的字符列表中:
斜杠(“/”)和问号(“?”)可以表示查询组件中的数据。请注意,当它用作相对引用(第5.1节)的基本URI时,一些旧的错误实现可能无法正确处理此类数据,似乎是因为它们在查找分层分隔符时未能区分查询数据和路径数据。但是,由于查询组件通常用于携带以“键=值”对形式的标识信息,并且一个经常使用的值是对另一个URI的引用,因此有时为了可用性而避免百分数编码这些字符。
现在,通常使用URLComponents
来百分数编码查询值:
var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
var components = URLComponents(string: "http://maps.googleapis.com/maps/api/geocode/json")!
components.queryItems = [URLQueryItem(name: "address", value: address)]
let url = components.url!
顺便提一下,尽管在上述RFC中没有考虑到,但W3C HTML规范的
5.2节,URL编码表单数据指出,
application/x-www-form-urlencoded
请求也应将空格字符替换为
+
字符(并包括不应被转义的字符中的星号)。不幸的是,
URLComponents
不能正确地进行百分比转义,因此苹果公司建议您在检索
URLComponents
对象的
url
属性之前手动进行百分比转义。
// configure `components` as shown above, and then:
components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
let url = components.url!
如果您需要Swift 2版本的翻译,其中我手动执行所有这些百分比转义,请参阅此答案的先前版本。
let urlpath = "http://maps.googleapis.com/maps/api/geocode/json?address=\(address)")
已经足够了。 - jithinroystringByAddingPercentEncodingWithAllowedCharacters
方法。你可以在这个回答中找到更多细节: https://dev59.com/uVwY5IYBdhLWcg3wwqH1#44643893 - Lal Krishna