【问题标题】:Send array as POST request parameter to PHP - Swift将数组作为 POST 请求参数发送到 PHP - Swift
【发布时间】:2020-04-26 11:29:39
【问题描述】:

我正在向 PHP 发送“formKATID”参数。我想发送多个“formKATID”。例如,我想选择数据库中 KATEGORI.ID = 6,7,8 的数据。这就是为什么我在bodyObject 中定义了多个formKATID。但它不是那样工作的。如何提交多个“formKATID”?我用 json_encode 打印“ExistCount”行并尝试通过 swift 提取计数输出,但它带有一个空值。我发送的数组有问题。

PHP
...

     $connectionInfo = array( "UID"=>$uid,
                                "PWD"=>$pwd,
                                "Database"=>$databaseName);

    $conn = sqlsrv_connect($serverName, $connectionInfo);

    $formKATID = $_POST['formKATID'];

    $tsql = "SELECT ... IN(".implode(', ',$formKATID).")";
    $stmt = sqlsrv_query( $conn, $tsql);

    while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {

        $paketCount = $row['ExistCount'];

         $results[] = Array("Count" => $paketCount);
    }
     echo json_encode($results, JSON_UNESCAPED_UNICODE);
    sqlsrv_free_stmt( $stmt);
    ?>

...

SWIFT

@objc func kategoriSaydır(){
    var request = URLRequest(url: url)
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    request.httpMethod = "POST"

    let bodyObject = ["formKATID": ["6", "7", "8"]] as [String : Any]
    request.httpBody = try! JSONSerialization.data(withJSONObject: bodyObject, options: [])

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else {
            // error
            return
        }
        do {
            if let baslik = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] {
                for review in baslik {
                    if let soru_baslik = review["Count"] as? String {
                        let s = String(describing: soru_baslik)
                        print("kategoriItemCount", s)
                    }
                }
            }
        } catch let parseError { ... }
    }
    task.resume()
}

【问题讨论】:

  • 有什么问题?您是否收到响应错误?您的快速代码看起来正确。你打电话给task.resume()吗?
  • 我使用 json_encode 打印“ExistCount”行并尝试通过 swift 提取计数输出,但它带有一个空值。我发送的数组有问题。
  • 我没有在代码中看到错误。你有一个有效请求的例子吗?您可以使用 Postman 创建请求 - postman.com
  • 当我在 Postman 中尝试时,它返回 null 值,我认为我的 php 代码有问题。但我找不到问题。 @VladislavMarkov
  • 我更新了php代码,你能检查一下吗?谢谢你。 @VladislavMarkov

标签: php swift


【解决方案1】:

您的参数是 url 编码的。

你应该添加它:

public extension String {

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

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

        return addingPercentEncoding(withAllowedCharacters: allowed)
    }

}

你可以试试这个:

func generateParametersString(_ parameters: [String: Any]) -> String {
    let parameterArray = parameters.map { key, value -> String in
        guard let escapedKey = key.addingPercentEncodingForUrlQueryValue() else { return "" }

        if let stringValue = value as? String {
            guard let escapedValue = stringValue.addingPercentEncodingForUrlQueryValue() else { return "" }

            return "\(escapedKey)=\(escapedValue)"
        }

        if let arrayValue = value as? [Any] {
            var arrayParameter: [String] = []

            for index in 0..<arrayValue.count {
                var element: String
                if let stringElement = arrayValue[index] as? String {
                    element = stringElement
                } else {
                    element = "\(arrayValue[index])"
                }

                guard let escapedElement = element.addingPercentEncodingForUrlQueryValue() else { continue }

                arrayParameter.append("\(escapedKey)[]=\(escapedElement)")
            }

            return arrayParameter.joined(separator: "&")
        }

        guard let escapedValue = "\(value)".addingPercentEncodingForUrlQueryValue() else { return "" }

        return "\(escapedKey)=\(escapedValue)"
    }

    return parameterArray.joined(separator: "&")
}

@objc func kategoriSaydır(){
    var request = URLRequest(url: url)
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    request.httpMethod = "POST"

    let bodyObject = ["formKATID": ["6", "7", "8"]] as [String : Any]
    request.httpBody = generateParametersString(bodyObject).data(using: .utf8)

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else {
            // error
            return
        }
        do {
            if let baslik = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] {
                for review in baslik {
                    if let soru_baslik = review["Count"] {
                        let s = String(describing: soru_baslik)
                        print("kategoriItemCount", s)
                    }
                }
            }
        } catch let parseError { ... }
    }
    task.resume()
}

【讨论】:

  • @deneov 我已经多次更新了我的答案。现在可以了。
  • @deneov 您是否使用了我编辑的答案?我得到了正确的响应和 json 对象。
  • @deneov 您的服务器使用 http。你有一个字典App Transport Security Settings,在Info.plist 中有一个元素Allow Arbitrary Load,值为YES
  • 空白数据来了,谢谢你的工作,你救了我的健康:)
猜你喜欢
  • 2016-08-02
  • 2016-05-30
  • 2016-09-03
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
相关资源
最近更新 更多