php - 来自 swift 的 JSON 请求在 php 中显示空数组

标签 php json swift urlrequest

我正在尝试从我的 swift 应用程序向 PHP 服务器发出请求。由于某种原因,php 将空数组显示为 $_REQUEST 变量。我已经查看了堆栈溢出并实现了我能找到的所有可能有帮助的内容,但仍然在 php.ini 中得到一个空数组。这是相关的快速代码...

func connect(_ pin: String, completion: @escaping(Result<ConnectResponse?, Error>) -> ()) {
  let params: [String : Any] = [
    "mobile_pin_connect": pin,
    "device_info": UIDevice().model,
    "additional_info": UIDevice().systemVersion
  ]
  doRequest(params: params) { (data) in
    if let data = data {
      do {
        let res = try JSONDecoder().decode(Dictionary<String, String>.self, from: data)
        completion(.success(
          ConnectResponse(success: (res["success"] == "true"), connect_id: res["connect_id"] ?? nil, error: res["error"] ?? nil)))
      } catch {
        completion(.failure(error))
      }
    } else {
      print("in else block")
    }
  }
}

fileprivate func doRequest(params: [String: Any], completion: @escaping (Data?) -> ()) {
        let body = createJsonBody(params)!
        self.request.httpBody = body
        print("Sending request with thw following variables")
        print(String(data: body, encoding: .utf8)!)
        print(String(data: self.request.httpBody!, encoding: .utf8))
        URLSession.shared.dataTask(with: self.request) { (data, response, error) in
            if let error = error {
                print("Error in request: \(error)")
                completion(nil)
            }
            let stringResult = String(data: data!, encoding: .utf8)!
            let properResult = String(stringResult.map {
                $0 == "." ? "=" : $0
            })
            let decodedData = Data(base64Encoded: properResult)
            completion(decodedData)
        }.resume()
    }

fileprivate func createJsonBody(_ params: [String: Any]) -> Data? {
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: params)
            let body = Data(jsonData).base64EncodedData()
            return body
        } catch {
            print("Unable to create json body: " + error.localizedDescription, error)
            return nil
        }
    }

将请求发送到服务器,请求的设置在静态变量设置中...

private static var sharedConnector: ApiConnector = {
        let url = URL(string: "https://mywebsiteURLhere.com/api/mobile/challenge")
        var request = URLRequest(url: url!)
        request.httpMethod = "POST"
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        let connector = ApiConnector(request)
        return connector
    }()

所以我有 application/json 的正确 header 值,我将请求方法设置为 post,我对 json 数据进行 base64 编码,并且在 PHP 中我设置了获取 php://input...

$rawRequest = file_get_contents("php://input");

并将 $_REQUEST 变量转储到错误日志中,但我总是得到数组\n(\n)\n 它只是显示一个空数组 我什至做到了

error_log("Raw request from index.php");
error_log(print_r($rawRequest, true));

并且它记录了一个完全空的行。 我不明白为什么 PHP 在请求中没有得到任何东西,从我在网上看到的所有内容来看,我正在快速正确地执行请求。非常感谢任何帮助。谢谢

最佳答案

根据您的 Swift 代码,您可以替换以下方法吗?

fileprivate func createJsonBody(_ params: [String: Any]) -> Data? {
        do {

            let jsonData = try JSONSerialization.data(withJSONObject: params)
            let body = Data(jsonData)
            return body
        } catch {
            print("Unable to create json body: " + error.localizedDescription, error)
            return nil
        }
    }

您需要将此行 let body = Data(jsonData) 替换为 let body = Data(jsonData).base64EncodedData()

关于php - 来自 swift 的 JSON 请求在 php 中显示空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59329179/

相关文章:

ios - 评估项目是否已在数组中

php - 如何在PHP中存储cookie以在不登录的情况下唯一标识用户投票

php - 使用 API 将图像上传到 facebook 粉丝页面

php - Zend Framework 1.x 和 2.x,它们的兼容性如何?

javascript - 解析没有子节点的 JSON 文档返回未定义

php - Json 与 jquery

arrays - 如何正确地将某些内容追加到数组中?

php - 如何使用 javascript 中的 onclick 事件链接到另一个 php 页面?

jquery - 在一天中的某些时间自动用 json 更新 html

ios - 如何快速获取即将到来的通知的日期?