Я пытаюсь сделать запрос PHP Post с Alamofire в моем быстром приложении, которое должно отправлять SMS с OVH API, но у меня возникла проблема:
FAILURE: Error Domain=com.alamofire.error Code=-6006 "JSON could not be serialized. Input data was nil or zero length." UserInfo={NSLocalizedFailureReason=JSON could not be serialized. Input data was nil or zero length.}
Я не нахожу, как увидеть эхо из сценария PHP, чтобы решить его. Я думаю, что это не проблема Alamofire, потому что я делаю другой запрос на отправку электронных писем, и это работает хорошо. Вот мой запрос, где есть ошибка:
func sendSmsAutoRequest(completionHandler: (responseObject: NSDictionary?, error: NSError?) -> ()) {
let prefs = NSUserDefaults.standardUserDefaults()
let username = prefs.stringForKey(StorageManager.USER_NAME)!
let messageText = prefs.stringForKey(StorageManager.MESSAGE_TEXT)!
let parameters = ["contactsSms": contactsSms, "username": username, "messageText": messageText]
request(.POST, "http://XXX/dontworry/sendAutoSms.php", parameters: (parameters as! [String : AnyObject])).responseJSON { response in
print(response)
}
}
и вот мой сценарий:
<?php
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;
$applicationKey = "XXX";
$applicationSecret = "XXX";
$consumer_key = "XXX";
$endpoint = "ovh-eu";
$contactsSms = $_POST['contactsSms'];
$userName = $_POST['username'];
$messageText = $_POST['messageText'];
$conn = new Api($applicationKey,
$applicationSecret,
$endpoint,
$consumer_key);
$smsServices = $conn->get('/sms/');
$content = (object) array(
"charset"=> "UTF-8",
"class"=> "phoneDisplay",
"coding"=> "7bit",
"message"=> $messageText,
"noStopClause"=> true,
"priority"=> "high",
"receivers"=> $contactsSms,
"senderForResponse"=> true,
"validityPeriod"=> 2880
);
$resultPostJob = $conn->post('/sms/'. $smsServices[0] . '/jobs/', $content);
$smsJobs = $conn->get('/sms/'. $smsServices[0] . '/jobs/');
echo '{"contacts": $contactsSms,"username": $username, "messageText": $messageText, "result": $resultPostJob, "sms": $smsJobs}'; ?>
РЕДАКТИРОВАТЬ: Кажется, работает, у меня больше нет ошибки! Но смс не отправляется …
С первого прочтения ваш PHP-скрипт, скорее всего, печатает неверный JSON. Следующий оператор выведет JSON, содержащий строки без кавычек (при условии, что один или несколько параметров, таких как $_POST['messsageText']
содержат строковые значения):
echo '{"contacts": $contactsSms,"username": $username, "messageText": $messageText, "result": $resultPostJob, "sms": $smsJobs}';
Пример вывода (довольно напечатан для удобства чтения):
{
"contacts": foobar, # <-- This is invalid! It's a string and needs to be quoted!
"username": johndoe,
"messageText": Hello World, # <-- This is even more invalid!
...
}
Я бы посоветовал положиться на PHP json_encode
функция для генерации правильного вывода JSON:
echo json_encode([
"contacts" => $contactsSms,
"username" => $username,
"messageText" => $messageText,
// etc.
]);
Это была ошибка в alamoFire, которая была исправлена в выпуске 3.1.1, см. тяга № 889, фиксированная версия работает, только если ваш REST-подобный сервис возвращает ответ 204 (NO_RESPONSE), что теоретически является правильным способом сделать это.
Сериализация — это процесс преобразования объекта в строку JSON. Так что проблема не в обработке вашего ответа, а в вашем запросе.
Записать содержимое вашего parameters
словарь, и проверьте для нулевых значений.