2015-05-21 45 views
4

我知道如何做到這一點,它非常簡單。如何在NSDictionary中發佈NSDictionary的NSArray沒有問題?

問題是它不起作用。

這是我使用過帳數據的功能:

- (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" : @"[email protected]", @"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;}] 

這太瘋狂了!

  1. 我已經成功地保存一本字典內的多個屬性的MySQL的場內字典的數組的JSON - 或短的什麼,我想在這裏做 - 使用PHP腳本,針對一不同的目的和它的作品,沒有問題。
  2. 我使用相同的PHP代碼將其保存到MySQL字段,因此它不是PHP的錯誤。
  3. 我使用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錯誤,因爲它沒有任何意義。

編輯:

我能:

  1. 讓兩個MySQL字段:websiteTitles,websiteURLs。

  2. 將其另存爲一個字符串:「Google; http://www.google.com」,然後將其分開,但這會破壞使用JSON的目的。

  3. 發送一半切碎的參數:websteTitles,websiteURLs

全部都是可怕的,任何想法?

編輯2:

我跑了幾個測試:

,如果數組有1或2項仍然表現得像這沒關係。

我試了一下rob180建議和--as expected--它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它會解決這個問題,但我真的不想這樣做,因爲我已經用這種方法編寫了很多方法。

+0

嘗試將發送給服務器的參數作爲響應發送。這樣你可以看到問題是在iOS還是PHP。 – rob180

+0

你有沒有試過設置requestSerializer? – vichevstefan

+0

不,我不需要爲10個以上的方法設置requestSerializer。現在,也許我需要它,但是如何?什麼設置會解決這個問題? – Vulkan

回答

3

「查詢字符串參數化不是編碼嵌套數據結構的可靠方法,這就是爲什麼所有現代web框架都有內置的便利功能,可以自動將傳入的JSON解碼爲參數。 - 馬特·湯普森

所以,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"; 
} 

全部完成!

純金。

+0

這個答案應該固定在主頁上。它減輕了像我這樣的所有挫折如此輕鬆的新手:') – Vulkan

+1

犯罪低估的投票數。 – GoldenJoe

+1

正義將被送達。事實將超越我的同伴overflower的閃爍世俗的幽默。 – Vulkan

2

更新功能AFQueryStringPairsFromKeyAndValue

變化

 for (id nestedValue in array) { 
     [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; 
    } 

 int i = 0; 
    for (id nestedValue in array) { 
     [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%d]", key, i++], nestedValue)]; 
    } 
0

曾與AFHTTPSessionManager同樣的問題。 不幸的是,你必須切換到AFJSONRequestSerializer送字典的數組:

manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

AFJSONRequestSerializer應用/ JSON一個期望JSON將成功地接受請求參數而AFHTTPRequestSerializer總會有文本內容類型和服務器/ HTML即使您明確設置了content-type標頭,也是如此。