如何解决从字符串创建 URL带编码
我正在尝试从字符串创建 URL,如下所示
let searchParam = "?name=movies&Genre=#Action"
func searchMovies(searchString: String) {
let encodedString = searchParam.encodeSearchString()
let urlString = "https://search.movies.local/list.html" + encodedString
guard let url = URL(string: searchParam) else {
return
}
print("URL: ",url)
}
func encodeSearchString() -> String? {
let unreserved = "#?=&"
let allowed = NSMutableCharacterSet.alphanumeric()
allowed.addCharacters(in: unreserved)
return addingPercentEncoding(withAllowedCharacters: allowed as CharacterSet)
}
当搜索参数为“?name=movies&Genre=#Action”时它工作正常,但如果搜索参数包含多个#,则 URL 为零。
例如,如果 searchParam 是“?name=#movies&Genre=#Action”
解决方法
问题在于 #
字符是 URL 的 fragment
的分隔符。
构建包含多个组件的 URL 最可靠的方法是 URLComponents
和 URLQueryItem
,编码是免费的
func searchMovies(with parameters: [String:String]) {
var urlComponents = URLComponents(string: "https://search.movies.local/list.html")!
var queryItems = [URLQueryItem]()
for (key,value) in parameters {
queryItems.append(URLQueryItem(name: key,value: value))
}
if !queryItems.isEmpty { urlComponents.queryItems = queryItems }
print("URL: ",urlComponents.url) // https://search.movies.local/list.html?genre=%23action&name=%23movie
}
searchMovies(with: ["name":"#movie","genre":"#action"])
或
func searchMovies(by query: String?) {
var urlComponents = URLComponents(string: "https://search.movies.local/list.html")!
var queryItems = [URLQueryItem]()
if let queryString = query {
let queryPairs = queryString.components(separatedBy: "&")
for aPair in queryPairs {
let keyValue = aPair.components(separatedBy: "=")
if keyValue.count != 2 { continue }
queryItems.append(URLQueryItem(name: keyValue[0],value: keyValue[1]))
}
if !queryItems.isEmpty { urlComponents.queryItems = queryItems }
}
print("URL: ",urlComponents.url) // https://search.movies.local/list.html?genre=%23action&name=%23movie
}
searchMovies(by: "name=#movies&Genre=#Action")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。