我确实知道该怎么做,这很简单。
问题是它不起作用。
这是我用来发布数据的函数:
- (void)updateWebsitesUsingParameters:(NSDictionary *)parameters;
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:@"http://notreal/updateWebsites.php"
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
//...
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//...
}];
}
以下是参数:
NSDictionary *parameters = @{@"type" : @"0",
@"credentials" : @{@"email" : @"notreal@gmail.com", @"password" : @"notreal"},
@"device" : @{@"ID" : @"8588107756600540", @"numberOfSessions" : @"0", @"name" : @"Nick's iMac"},
@"websites" : @[@{@"title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]};
这是保存在MySQL字段中的内容:
[{URL = "http://www.google.com";},{title = Google;},{URL = "http://www.yahoo.com";},{title = Yahoo;}]
这很疯狂!
这有效:
@[@{@"title" : @"Google"}, @{@"title" : @"Yahoo"}]
这不是:
@[@{@"title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]
这是回应:
{
websites = (
{
URL = "http://www.google.com";
},
{
title = Google;
},
{
URL = "http://www.yahoo.com";
},
{
title = Yahoo;
}
);
}
INSANE!
由于某种原因,如果我添加了额外的属性,它就会崩溃。
这必须是 AFNetworking 错误,因为它没有任何意义。
编辑:
我可以:
所有人都很丑陋,有什么想法吗?
编辑2:
我运行了一些测试:
数组具有1或2个项目都没有关系,它的行为仍然像这样。
我尝试了 rob180 的建议,并且-如预期的那样-这是AFNetwokring的错:
{
websites = (
{
URL = "http://www.google.com";
},
{
title = Google;
},
{
URL = "http://www.yahoo.com";
},
{
title = Yahoo;
}
);
}
这是从应用程序发送的实际服务器响应,中间没有mysql。
编辑3:
REQUEST: <NSMutableURLRequest: 0x7f9352d467e0> { URL: http://notreal/updateWebsites.php }
HTTPBody 如下所示:
<63726564 656e7469 616c735b ... 653d30>
我该如何解码?
另外,我正在使用 AFHTTPRequestSerializer 。也许,如果我将其更改为 AFJSONRequestSerializer ,它将解决此问题,但是我真的不想这么做,因为我已经用这种方式编写了许多方法。
最佳答案
“查询字符串参数化根本不是编码嵌套数据结构的可靠方法。这就是为什么所有现代Web框架都具有内置的便利,这些便利可以自动将传入的JSON解码为参数。” - Mattt Thompson
因此, JSON 是...
参数:
NSDictionary *parameters = @{@"websites" : @[@{@"Title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"Title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]};
发送:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:@"http://server/path/file.php"
parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"JSON: %@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error: %@", error.description);
}];
检索:
<?php
header('Content-type: application/json');
$request = json_decode(file_get_contents('php://input'), TRUE);
$response = ["URLOfTheSecondWebsite" => $request['websites'][1]['URL']];
echo json_encode($response);
?>
响应:
{
URL = "http://yahoo.com";
}
全做完了!
纯金。