Запрос POST с JSON-словарем не возвращает правильное значение с $ _POST в Swift 3?

Я пытаюсь сделать, чтобы устройство IMEI было вставлено в базу данных.

Однако возвращенный вывод JSON из базы данных показывает IMEI как null .

Вот что было реализовано:

Запроса

 class Requester { .... func postRequest(_ url: URL, headers : Dictionary<String,String>?, data: Data?, callback : @escaping (_ response: HTTPResponseWithData) -> Void) -> Void { let request = Factory.httpRequest(url, method: "POST", headers: headers, data: data) let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data, response, error in print("RESPONSE: \(response)"); }) task.resume() } .... } 

завод

 class Factory { func httpRequest(_ url: URL, method: String, headers: Dictionary<String, String>?, data: Data?) -> URLRequest { var request = URLRequest(url: url) request.httpMethod = method if headers != nil { for (field, value) in headers! { request.addValue(value, forHTTPHeaderField: field) } } if data != nil { request.httpBody = data } return request } } 

MainVC

 let requester = Requester() @IBAction func sendRequest(_ sender: Any) { var json: Dictionary<String, Any> = [:] json["imei"] = myIMEI do { let data = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted) post(theData: data) } catch let error as NSError { print(error.localizedDescription) } } func post(theData: Data) -> Void { self.requester.postRequest("www.url.com", headers: nil, data: theData, callback: {(response: HTTPResponseWithData) -> Void in if response.statusCode == 200 && response.data != nil && HTTPHeader.isContentTypeJSON(response.mimeType) { print(response.data!) do { if let test = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions()) as? Dictionary<String, Any> { print("test = \(test)") } } catch { print("ERROR parsing data") } } else { } }); } 

Я вернусь с выхода:

 test = ["imei": <null>] 

Я смотрел на многочисленные вопросы и ответы по поводу этого, и, кроме того, что моя реализация была в разных классах, я не вижу, что может быть неправильным.

Вот фрагмент кода PHP:

 header("Content-Type: application/json"); $imei = $_POST["imei"]; $something_else = $_POST["something_else"]; $mysqli = new mysqli($host, $userid, $password, $database); if ($mysqli->connect_errno) { echo json_encode(array("success" => false, "message" => $mysqli->connect_error, "sqlerrno" => $mysqli->connect_errno)); exit(); } echo json_encode( array('imei'=>$imei) ); 

Что именно не так с моей реализацией запроса POST, которая не позволяет мне отправлять IMEI в базу данных?

Если это помогает, выход RESPONSE :

RESPONSE: необязательно ({URL: http://www.url.com } {код состояния: 200, заголовки {Connection = "Keep-Alive"; "Content-Type" = "application / json"; Date = "Mon, 02 Янв 2017 08:07:54 GMT ";" Keep-Alive "=" timeout = 2, max = 96 "; Server = Apache;" Transfer-Encoding "= Identity;}})

ОБНОВЛЕНИЕ: после дальнейшего тестирования я заменил вышеуказанный PHP-код после header следующим кодом, и теперь сообщается о imei :

 $handle = fopen("php://input", "rb"); $raw_post_data = ''; while (!feof($handle)) { $raw_post_data .= fread($handle, 8192); } fclose($handle); $request_data = json_decode($raw_post_data, true); $imei = $request_data["imei"]; 

Я в замешательстве, почему это так, что обновленный PHP-код работает, но тот, который $_POST с $_POST , не работает?

    См. Документацию $_POST которой говорится:

    Ассоциативный массив переменных передается текущему скрипту с помощью метода HTTP POST при использовании application/x-www-form-urlencoded или multipart/form-data в качестве HTTP Content-Type в запросе.

    Но вы не выполняете запрос x-www-form-urlencoded . Вы выполняете запрос application/json . Таким образом, вы не можете использовать $_POST . Используйте php://input (например, как описано здесь: iOS Отправить данные JSON в запросе POST с использованием NSJSONSerialization ).