Php 无法序列化Alamofire JSON
我试图在我的swift应用程序中使用Alamofire发出PHP Post请求,该应用程序必须使用OVH api发送短信,但我遇到了一个问题:Php 无法序列化Alamofire JSON,php,ios,json,swift,alamofire,Php,Ios,Json,Swift,Alamofire,我试图在我的swift应用程序中使用Alamofire发出PHP Post请求,该应用程序必须使用OVH api发送短信,但我遇到了一个问题: FAILURE:Error Domain=com.alamofire.Error code=-6006“JSON无法序列化。输入数据为零或零长度。UserInfo={NSLocalizedFailureReason=JSON无法序列化。输入数据为零或零长度。} 我没有找到如何从PHP脚本中看到回声来解决它。我认为这不是Alamofire的问题,因为我提出
FAILURE:Error Domain=com.alamofire.Error code=-6006“JSON无法序列化。输入数据为零或零长度。UserInfo={NSLocalizedFailureReason=JSON无法序列化。输入数据为零或零长度。}
我没有找到如何从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}'; ?>
编辑:这似乎是工作,我没有错误了!但是SMS不会被发送…序列化是将对象转换为JSON字符串的过程。因此,问题不在于如何处理您的响应,而在于如何处理您的请求
记录
参数
字典的内容,并检查零值。第一次阅读时,PHP脚本很可能打印出无效的JSON。下面的语句将打印包含无引号字符串的JSON(假设一个或多个参数,如$\u POST['MessageText']
包含字符串值):
输出示例(为便于阅读,打印精美):
这是alamoFire中的一个bug,在3.1.1版中已修复,请参阅,只有在REST-like服务返回响应204(无响应)时,修复版本才有效,理论上这是正确的方法。尝试添加
参数![字符串:AnyObject],编码:.JSON)
。。可能的话,可以尝试使用参数![String:String],编码:.JSON)
can@senty-否,响应是JSON。但是如果您查看PHP代码,web服务期望的是application/x-www-form-urlencoded
请求。将请求设置为JSON会使情况变得更糟。Karz,helmbert在这里正确地诊断了一个问题。构建关联数组,然后对其进行编码。还要注意,PHP在输入中引用了$userName
,在输出中引用了$userName
(但从未真正使用过它?)。但是,如果你的短信仍然没有发出,你需要诊断发生了什么。您在返回的JSON中包含了$contactsSms
、$username
和$messageText
,这看起来怎么样?什么是$smsJobs
?编辑您的问题,并向我们展示此响应.result.value
的外观。
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!
...
}
echo json_encode([
"contacts" => $contactsSms,
"username" => $username,
"messageText" => $messageText,
// etc.
]);