我正在使用GET方法,我必须在URL中传递电子邮件地址。 API期望它被编码。我试过编码选项,但'+'字符无法编码。
我尝试使用以下代码
let encodedEmail = emailAddressTxt.text!.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
let urlString = "http://www.example.com/User/GetUserDetailsByEmailAddress?EmailAddress=\(encodedEmail!)"
print(escapedString)
打印http://www.example.com/User/GetUserDetailsByEmailAddress?EmailAddress=mano+1%40gmail.com
“@”字符仅编码且“+”未编码。
答案 0 :(得分:17)
不幸的是,CharacterSet.urlHostAllowed
和CharacterSet.urlQueryAllowed
都包含+
允许。由于历史原因,大多数Web服务器会将+
视为空格的替换(),因此您需要转义
+
。
出于此目的,您可能需要定义自己的CharacterSet
:
extension CharacterSet {
static let rfc3986Unreserved = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~")
}
let emailAddressText = "mano+1@gmail.com"
let encodedEmail = emailAddressText.addingPercentEncoding(withAllowedCharacters:.rfc3986Unreserved)
print(encodedEmail!) //->mano%2B1%40gmail.com
答案 1 :(得分:3)
使用.urlHostAllowed字符集' +'没有编码。
将扩展名添加到String,如下所示
public func stringByAddingPercentEncodingToData() -> String? {
let finalString = self.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)?.replacingOccurrences(of: "&", with: "%26").replacingOccurrences(of: "+", with: "%2B")
return finalString
}
你可以这样做。
答案 2 :(得分:-1)
试试这个:
let encodedEmail = emailAddressTxt.text!
var urlString = "http://yyy.xxx.com/User/GetUserDetailsByEmailAddress?EmailAddress=\(encodedEmail)"
urlString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
或
let encodedEmail = emailAddressTxt.text!
let urlString = "http://yyy.xxx.com/User/GetUserDetailsByEmailAddress?EmailAddress=\(encodedEmail!)"
urlString = urlString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
print(escapedString)