【问题标题】:HTTP Post Parameters are passed json encoded to $_POSTHTTP Post 参数通过 json 编码传递给 $_POST
【发布时间】:2016-12-11 22:41:57
【问题描述】:

我不知道如何正确发送 POST 参数。

我的斯威夫特 3:

let parameters = ["name": "thom", "password": "12345"] as Dictionary<String, String>
let url = URL(string: "https://mywebsite.com/test.php")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
do
{
    request.httpBody = try JSONSerialization.data(withJSONObject: parameters)
}
catch let error
{
    print(error.localizedDescription)
}
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = session.dataTask(with: request as URLRequest, completionHandler: 
{
    data, response, error in
    guard error == nil else
    {
        print(error as Any)
        return
    }           
    guard let data = data else
    {
        return
    }
    do 
    {
        if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] 
        {
            print(json)
            print(json["post"]!)
        }
        else
        {
            print("no json")
        }
    }
    catch let error
    {
        print(error.localizedDescription)
    }
})
task.resume()

我的 PHP:

<?php
header('Content-Type: application/json');
if(empty($_POST)) echo json_encode(array('post'=>'empty'));
else echo json_encode($_POST+array('post'=>'not_empty'));
exit;

如果我将 content-type 标头(在 Swift 中)设置为 application/json,我会得到:

["post": empty]
empty

如果我将其设置为application/x-www-form-urlencoded,我会得到:

["{\"name\":\"thom\",\"password\":\"12345\"}": , "post": not_empty]
not_empty

如何将字典作为 $_POST 键/值对而不是 json_encoded 字符串发送到我的服务器?

【问题讨论】:

  • 这对你来说可能很有趣stackoverflow.com/questions/40433229/…
  • 这很有趣,但不确定它有什么帮助。我需要将参数字典作为键/值对传递给我的 $_POST 变量。如果我不在客户端对我的参数进行 json_encode,我会收到一条错误消息,提示我无法将类型 AnyObject 传递给类型数据?
  • 我看过那个帖子。这就是我得到我的快速代码的地方(来自零票的答案)。我不想将查询字符串传递给服务器。我想通过字典。
  • 获得key=value 字符串数组后,使用joined(separator: "&amp;") 将它们组合在一起。

标签: php json post swift3


【解决方案1】:

您希望将请求百分比转义为 x-www-form-urlencoded 请求,如下所示:

let parameters = ["name": "thom", "password": "12345"]
let url = URL(string: "https://mywebsite.com/test.php")!

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.updateHttpBody(with: parameters)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

let task = session.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        print("\(error)")
        return
    }

    // handle response here
}
task.resume()

在哪里

extension URLRequest {

    /// Populate the `httpBody` of `application/x-www-form-urlencoded` request.
    ///
    /// - parameter parameters:   A dictionary of keys and values to be added to the request

    mutating func updateHttpBody(with parameters: [String : String]) {
        let parameterArray = parameters.map { (key, value) -> String in
            return "\(key.addingPercentEncodingForQueryValue()!)=\(value.addingPercentEncodingForQueryValue()!)"
        }
        httpBody = parameterArray.joined(separator: "&").data(using: .utf8)
    }
}

extension String {

    /// Percent escape value to be added to a HTTP request
    ///
    /// This percent-escapes all characters besides the alphanumeric character set and "-", ".", "_", and "*".
    /// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec:
    ///
    /// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
    ///
    /// - returns: Return percent escaped string.

    func addingPercentEncodingForQueryValue() -> String? {
        let generalDelimitersToEncode = ":#[]@?/"
        let subDelimitersToEncode = "!$&'()*+,;="

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

        return addingPercentEncoding(withAllowedCharacters: allowed)?.replacingOccurrences(of: " ", with: "+")
    }
}

【讨论】:

  • 这看起来很棒。如何/在哪里添加这些扩展?
  • 现在,只需将它们放在您正在执行此网络工作的任何 .swift 文件中(但不要放在现有的 class/struct 定义中,而是在之前或之后)。从长远来看,您可能会将它们放在单独的 .swift 文件中。
  • 谢谢。我将它们放在一个新文件中:extensions.swift 完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
相关资源
最近更新 更多