Alamofire JSON无法序列化



我正试图在我的swift应用程序中使用Alamofire发出PHP Post请求,该应用程序必须使用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脚本中看到echos来解决它。我认为这不是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 OvhApi;
$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版中修复,请参阅pull#889,只有当类似REST的服务返回响应204(NO_response)时,修复版本才能工作,这在理论上是正确的方法。

序列化是将对象转换为JSON字符串的过程。所以问题不在于对你的回应的处理,而在于对你请求的处理。

记录parameters字典的内容,并检查nil值。

最新更新