使用 Alamofire 从 PHP 服务器检索 JSON 时出现问题
Problems retrieving JSON from PHP server using Alamofire
当我发送数组时,我在服务器中检索到一个错误的JSON:
客户端对象:
class Dummy : Mappable {
var test1 = "test1";
var test2 = "test2";
func mapping(map: Map) {
test1 <= map["test1"]
test2 <= map["test2"]
}
required init(){}
}
客户来电:
let wrongDummies : [Dummy] = [Dummy(), Dummy()];
let wrongDummiesJSONArray = Mapper().toJSONArray(wrongDummies)
let dummies : [String:AnyObject] = [
"right": Mapper().toJSON(Dummy()),
"again_right": ["dummy1" : Mapper().toJSON(Dummy()), "dummy2" : Mapper().toJSON(Dummy())],
"wrong": [Mapper().toJSON(Dummy()), Mapper().toJSON(Dummy())],
"again_wrong": wrongDummiesJSONArray
]
println(dummies)
request(.POST, PROFILE_URL, parameters: dummies)
客户端打印(看起来还可以):
[right: {
test1 = test1;
test2 = test2;
}, wrong: (
{
test1 = test1;
test2 = test2;
},
{
test1 = test1;
test2 = test2;
}
), again_right: {
dummy1 = {
test1 = test1;
test2 = test2;
};
dummy2 = {
test1 = test1;
test2 = test2;
};
}, again_wrong: (
{
test1 = test1;
test2 = test2;
},
{
test1 = test1;
test2 = test2;
}
)]
服务器实现(PHP):
ini_set("log_errors", 1);
ini_set("error_log", "$root/php-error.log");
error_log(print_r($_POST, true));
响应服务器:
Array
(
[again_right] => Array
(
[dummy2] => Array
(
[test2] => test2
[test1] => test1
)
[dummy1] => Array
(
[test2] => test2
[test1] => test1
)
)
[again_wrong] => Array
(
[0] => Array
(
[test2] => test2
)
[1] => Array
(
[test1] => test1
)
[2] => Array
(
[test2] => test2
)
[3] => Array
(
[test1] => test1
)
)
[right] => Array
(
[test2] => test2
[test1] => test1
)
[wrong] => Array
(
[0] => Array
(
[test2] => test2
)
[1] => Array
(
[test1] => test1
)
[2] => Array
(
[test2] => test2
)
[3] => Array
(
[test1] => test1
)
)
)
如您所见,数组中的对象按其属性的数量拆分,而字典中的对象不会发生这种情况。
在您的日志中,我们看到了来自 iOS 端和 PHP 端的数据,但我们无法真正判断实际传输的是什么。我们必须看看问题实际发生在哪一边,所以看看您是否可以打印出正在发送的实际 HTTP 请求。如果JSON错了,那么iOS这边就错了,否则PHP就是读错了。
首先,确保将参数作为 JSON 发送到服务器。默认情况下,Alamofire 将默认使用 URL 编码,除非您指定要 JSON。
接下来,您似乎正在打印 $_POST
,这表明您可能将数据作为 URL 编码参数发送,而不是 JSON。那可能会把事情搞砸。
如果 Alamofire 以 JSON 的形式发送数据,而您在服务器上没有得到任何数据,那么请确保将其更改为使用JSON里面的数据:
$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE );
我认为这应该可以涵盖您的基本情况,或者至少让您有一个良好的开端:)
当我发送数组时,我在服务器中检索到一个错误的JSON:
客户端对象:
class Dummy : Mappable {
var test1 = "test1";
var test2 = "test2";
func mapping(map: Map) {
test1 <= map["test1"]
test2 <= map["test2"]
}
required init(){}
}
客户来电:
let wrongDummies : [Dummy] = [Dummy(), Dummy()];
let wrongDummiesJSONArray = Mapper().toJSONArray(wrongDummies)
let dummies : [String:AnyObject] = [
"right": Mapper().toJSON(Dummy()),
"again_right": ["dummy1" : Mapper().toJSON(Dummy()), "dummy2" : Mapper().toJSON(Dummy())],
"wrong": [Mapper().toJSON(Dummy()), Mapper().toJSON(Dummy())],
"again_wrong": wrongDummiesJSONArray
]
println(dummies)
request(.POST, PROFILE_URL, parameters: dummies)
客户端打印(看起来还可以):
[right: {
test1 = test1;
test2 = test2;
}, wrong: (
{
test1 = test1;
test2 = test2;
},
{
test1 = test1;
test2 = test2;
}
), again_right: {
dummy1 = {
test1 = test1;
test2 = test2;
};
dummy2 = {
test1 = test1;
test2 = test2;
};
}, again_wrong: (
{
test1 = test1;
test2 = test2;
},
{
test1 = test1;
test2 = test2;
}
)]
服务器实现(PHP):
ini_set("log_errors", 1);
ini_set("error_log", "$root/php-error.log");
error_log(print_r($_POST, true));
响应服务器:
Array
(
[again_right] => Array
(
[dummy2] => Array
(
[test2] => test2
[test1] => test1
)
[dummy1] => Array
(
[test2] => test2
[test1] => test1
)
)
[again_wrong] => Array
(
[0] => Array
(
[test2] => test2
)
[1] => Array
(
[test1] => test1
)
[2] => Array
(
[test2] => test2
)
[3] => Array
(
[test1] => test1
)
)
[right] => Array
(
[test2] => test2
[test1] => test1
)
[wrong] => Array
(
[0] => Array
(
[test2] => test2
)
[1] => Array
(
[test1] => test1
)
[2] => Array
(
[test2] => test2
)
[3] => Array
(
[test1] => test1
)
)
)
如您所见,数组中的对象按其属性的数量拆分,而字典中的对象不会发生这种情况。
在您的日志中,我们看到了来自 iOS 端和 PHP 端的数据,但我们无法真正判断实际传输的是什么。我们必须看看问题实际发生在哪一边,所以看看您是否可以打印出正在发送的实际 HTTP 请求。如果JSON错了,那么iOS这边就错了,否则PHP就是读错了。
首先,确保将参数作为 JSON 发送到服务器。默认情况下,Alamofire 将默认使用 URL 编码,除非您指定要 JSON。
接下来,您似乎正在打印 $_POST
,这表明您可能将数据作为 URL 编码参数发送,而不是 JSON。那可能会把事情搞砸。
如果 Alamofire 以 JSON 的形式发送数据,而您在服务器上没有得到任何数据,那么请确保将其更改为使用JSON里面的数据:
$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE );
我认为这应该可以涵盖您的基本情况,或者至少让您有一个良好的开端:)