在Swift 3及更高版本中,您可以:
let url = URL(string: "http://www.thisismylink.com/postName.php")!var request = URLRequest(url: url)request.setValue("application/x-www-form-urlenpred", forHTTPHeaderField: "Content-Type")request.httpMethod = "POST"let parameters: [String: Any] = [ "id": 13, "name": "Jack & Jill"]request.httpBody = parameters.percentEnpred()let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, let response = response as? HTTPURLResponse, error == nil else { // check for fundamental networking error print("error", error ?? "Unknown error") return } guard (200 ... 299) ~= response.statusCode else { // check for http errors print("statusCode should be 2xx, but is (response.statusCode)") print("response = (response)") return } let responseString = String(data: data, encoding: .utf8) print("responseString = (responseString)")}task.resume()哪里:
extension Dictionary { func percentEnpred() -> Data? { return map { key, value in let escapedKey = "(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? "" let escapedValue = "(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? "" return escapedKey + "=" + escapedValue } .joined(separator: "&") .data(using: .utf8) }}extension CharacterSet { static let urlQueryValueAllowed: CharacterSet = { let generalDelimitersToEnpre = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 let subDelimitersToEnpre = "!$&'()*+,;=" var allowed = CharacterSet.urlQueryAllowed allowed.remove(charactersIn: "(generalDelimitersToEnpre)(subDelimitersToEnpre)") return allowed }()}这将检查基本的网络错误以及高级HTTP错误。这也可以正确地对查询的参数进行转义。
请注意,我使用的
nameof
Jack & Jill来说明的正确
x-www-form-urlenpred结果
name=Jack%20%26%20Jill,该结果是“百分比编码”的(即,空格替换为
%20,
&值中的替换为
%26)。



