HTTP Post Parameters are passed json encoded to $_POST(HTTP Post 参数通过 json 编码到 $_POST)
问题描述
我不知道如何正确发送 POST 参数.
I can't figure out how to properly send POST parameters.
我的 Swift 3:
My Swift 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;
如果我将内容类型标头(在 Swift 中)设置为 application/json 我得到:
If I set the content-type header (in Swift) to application/json I get:
["post": empty]
empty
如果我将它设置为 application/x-www-form-urlencoded 我得到:
If I set it to application/x-www-form-urlencoded I get:
["{"name":"thom","password":"12345"}": , "post": not_empty]
not_empty
如何将字典作为 $_POST 键/值对而不是 json_encoded 字符串发送到我的服务器?
How do I send the dictionary to my server as $_POST key/value pairs, not as a json_encoded string?
推荐答案
您想将请求百分比转义为 x-www-form-urlencoded 请求,如下所示:
You want to percent-escape the request into a x-www-form-urlencoded request, like so:
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: "+")
    }
}
这篇关于HTTP Post 参数通过 json 编码到 $_POST的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:HTTP Post 参数通过 json 编码到 $_POST
 
				
         
 
            
        - Laravel 5:Model.php 中的 MassAssignmentException 2021-01-01
- PHP foreach() 与数组中的数组? 2022-01-01
- 覆盖 Magento 社区模块控制器的问题 2022-01-01
- 如何使用 Google API 在团队云端硬盘中创建文件夹? 2022-01-01
- 如何在 Symfony2 中正确使用 webSockets 2021-01-01
- Oracle 即时客户端 DYLD_LIBRARY_PATH 错误 2022-01-01
- openssl_digest vs hash vs hash_hmac?盐与盐的区别HMAC? 2022-01-01
- PHP - if 语句中的倒序 2021-01-01
- 使用 GD 和 libjpeg 支持编译 PHP 2022-01-01
- 如何从数据库中获取数据以在 laravel 中查看页面? 2022-01-01
