Я пытаюсь сделать, это отправить 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
не?
Увидеть $_POST
документация который говорит, что это:
Ассоциативный массив переменных, переданных в текущий скрипт через HTTP
POST
метод при использованииapplication/x-www-form-urlencoded
или жеmultipart/form-data
как HTTPContent-Type
в запросе.
Но ты не делаешь x-www-form-urlencoded
запрос. Вы выполняете application/json
запрос. Так что вы не можете использовать $_POST
, использование php://input
(например, как обсуждено здесь: iOS отправляет данные JSON в POST-запросе с помощью NSJSONSerialization).
Других решений пока нет …