我确实知道该怎么做,这很简单。

问题是它不起作用。

这是我用来发布数据的函数:

- (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;}]

这很疯狂!
  • 我已经成功地使用MySQL字段将字典中具有多个属性的字典数组的JSON保存在MySQL字段内​​(或简而言之,我在这里尝试做的事情),该脚本使用了PHP脚本用于其他用途,并且可以正常工作,没问题。
  • 我使用相同的PHP代码将其保存到MySQL字段,因此不是PHP的故障。
  • 我使用AFNetworking所做的所有其他保存/检索功能都可以正常工作。

  • 这有效:
    @[@{@"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 错误,因为它没有任何意义。

    编辑:

    我可以:
  • 创建两个MySQL字段:websiteTitles,websiteURLs。
  • 将其另存为一个字符串:“Google; http://www.google.com”,然后将其分开,但这违背了使用JSON的目的。
  • 发送参数切成两半:websteTitles,网站URL

  • 所有人都很丑陋,有什么想法吗?

    编辑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";
    }
    

    全做完了!

    纯金。

    10-08 08:00
    查看更多