Запрос 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>]

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

Вот небольшой фрагмент кода 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 вывод:

ОТВЕТ: Необязательно ({URL:
http://www.url.com } {код состояния: 200, заголовки {
Connection = «Keep-Alive»;
«Content-Type» = «application / json»;
Дата = «Пн, 02 января 2017 г. 08:07:54 GMT»;
«Keep-Alive» = «timeout = 2, max = 96»;
Сервер = Apache;
«Transfer-Encoding» = личность; }})

ОБНОВИТЬ: После дальнейшего тестирования я заменил вышеуказанный код 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 не?

1

Решение

Увидеть $_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).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]