【发布时间】:2019-12-13 20:07:17
【问题描述】:
我正在尝试从我的 swift 应用程序向 PHP 服务器发出请求。由于某种原因,php 将一个空数组显示为 $_REQUEST 变量。我已经查看了堆栈溢出并实现了我能找到的所有可能有帮助的东西,但仍然在 php.ini 中得到一个空数组。这是相关的swift代码...
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 设置了正确的标头值,我设置了要发布的请求方法,我正在对 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 在请求中什么也没得到,我正在迅速正确地执行请求。非常感谢任何帮助。谢谢
【问题讨论】:
-
error_log(print_r($rawRequest, true));不等于error_log(print_r($_REQUEST)); -
首先,即使您成功发送了 JSON,
$_REQUEST也会为空。无论如何,小代码片段无助于解决您的问题。显示 PHP 和 Swift 的可构建和可执行代码。问题可能隐藏在隐藏的部分。
标签: php json swift urlrequest