我试图在Swift中运行一个HTTP请求,向一个URL发送两个参数.

例子:

链接:www.thisismylink.com/postName.php

参数:

id = 13
name = Jack

最简单的方法是什么?

我甚至不想看回复.我只想通过一个PHP文件发送它来对我的数据库执行更改.

推荐答案

在Swift 3及更高版本中,您可以:

let url = URL(string: "http://www.thisismylink.com/postName.php")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let parameters: [String: Any] = [
    "id": 13,
    "name": "Jack & Jill"
]
request.httpBody = parameters.percentEncoded()

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 percentEncoded() -> 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 generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
        let subDelimitersToEncode = "!$&'()*+,;="

        var allowed = CharacterSet.urlQueryAllowed
        allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
        return allowed
    }()
}

这将判断基本的网络错误以及高级HTTP错误.这也正确地转义了查询的参数.

请注意,我使用了Jack & Jill中的name来说明name=Jack%20%26%20Jill的正确x-www-form-urlencoded结果,即"百分比编码"(即用%20替换空格,用%26替换值中的&).


请参见previous revision of this answer了解Swift 2格式副本.

Swift相关问答推荐

在SwiftUI中使用自定义图像填充列表行的正确方法

无法创建MKAssociateRegion对象

如何在DATE()中进行比较

swift:只要框架名称中有一个带有框架名称的公共实体,就指定框架中公共 struct 的路径

调度组是否阻止iOS中的主线程?

如何在应用程序区域永久更改 NSCursor?

try 从闭包访问返回的字符串时出现无法将类型 '()' 的返回表达式转换为返回类型 'String'编译器错误

从 Obj-C 函数返回 swift 类的不兼容指针类型

解码 JSON 时 Swift Struct Decoder 初始化程序错误

当变量首次用于其自己的初始化时,如何清除变量...在初始化之前使用错误?

Swift Random Float Fatal Error:在无限范围内没有均匀分布

如何延迟 swift 属性 didSet 使其每秒只触发一次

有没有更快的方法来循环浏览 macOS 上已安装的应用程序?

如何更改任务栏 colored颜色 和 sf 符号 colored颜色 ?

如何仅将 SwiftUI 不透明度应用于父视图?

Alamofire 会自动存储 cookie 吗?

即使设置为从不也可以访问 iOS11 照片库

使用 Swift 在 iOS 8 中为应用程序图标添加徽章

无法停止 AVPlayer

滑动侧边栏菜单 IOS 8 Swift