2013-01-03 73 views
0

這是我第一次將應用程序連接到網絡,我只是想確保我清楚這是如何工作的。 我想從一個在線託管的MySQL數據庫下載數據,它似乎也有PHP附加(hostgator)是主機。瞭解xcode json web請求

所以步驟如下: 1.在php中(在服務器模塊上),設置一個方法,使用附加的PHP模塊將mysql信息轉錄成JSON。返回數組(JSON我認爲這是一個mutilayered字典數組對象)

  1. 在Xcode中,使用蘋果的JSON框架來創建一個URL請求,並下載數據到一個JSON對象(或數組或字典?

  2. 經過數據和創建對象並保存到coredata。

請讓我知道如果正確遵循了邏輯IM。

而且JSON是否返回1個對象或mysql db上的所有對象。所以如果我需要在coredata上輸入10,000個對象,我必須提出10,000個請求或一個請求並解析10,000個值得信息的對象?

也是這是做我需要做的最好的方法嗎?我聽說過http請求,但看起來很複雜,我不知道它是什麼。

對不起,這樣的noob問題。

感謝您的幫助。

回答

3

有很多方法可以做到這一點,一些「更正確」比別人:-)但你是正確的。 我解釋了我會在類似情況下做什麼:

1-對於PHP引擎,您應該創建一個API來訪問您的數據。哪些數據? 最簡單,也許你可以做的第一件事就是測試(僅用於測試目的!)是創建一個頁面,通過POST從您的ios APP接收查詢並用編碼的JSON字符串回答。使用JSON,您可以傳輸整個對象層次結構:變量,數組,字典......由您決定如何將對象鏈接在一起。 如果您想對數據進行編碼是一個表,你可以做一些與此類似:

// first connect to the database and execute the query, then... 

$data = array(); 
while(!$RS->EOF){ 
for ($i = 0; $i < $cols; $i++){ 
    $rowName = utf8_encode($RS->Fields[$i]->name); 
    $rowValue = utf8_encode($RS->Fields[$i]->value); 
    $rowData[$rowName] = $rowValue; 
} 

array_push($data, $rowData); 
$RS->MoveNext(); 
} 

$response['data'] = $data; 
echo json_encode($response); 

結果與第一字典,一個名爲「數據」鍵JSON對象。 在「數據」鍵裏面有一個字典數組。每個字典有關鍵的列名,併爲數據的列值:

data =  (
      { 
     attivita = "this is the first row in the table"; 
     id = 2548; 
     }, 
      { 
     attivita = "this is the second row in the table"; 
     id = 2547; 
     }; 
} 

您只需使用json_encode來創建JSON字符串。

在iPhone端,我建議你下載並使用AFNetworking。這是一個非常好的和開源框架,有很多內置的對象和方法對HTTP/HTTPS請求,XML,JSON ECC ... 使用AFNetworking你可以以類似的方式請求:

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:@"http://url.for.the.php.page"]; 
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:mainPath parameters:params]; 


AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 

    // your success code here 

    // remember, the first object is a dictionary with a key called data 
    NSArray *arrayOfData = [JSON objectForKey:@"data"]; 

    NSMutableArray *arrayOfActivities = [NSMutableArray array]; 

    for (NSDictionary *objectDictionary in arrayOfData) { 
     // objectDictionary is your dictionary containing 
     // a key with the column name and a value with the column content 
     // here you can init your custom objects 

    } 


} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
    // your failure code here 
}]; 

[operation start]; 

正如你所看到的,JSONRequestOperationWithRequest:方法完成處理程序返回你解碼JSON,這樣你就可以訪問你的字典/陣列直接使用objectForKey或objectAtIndex ;-)

最後建議:在生產和安全的環境,你應該避免通過發佈請求發送查詢。我在這裏粘貼的代碼是用於私人應用程序(僅供我用於測試目的)。最好爲每種請求和安全的身份驗證方法使用不同的API(查看oAuth)。 我建議你看看Instagram或Twitter API(Instagram更簡單),試圖使用它。他們會給你一些關於如何創建你自己的API的想法。

祝你好運

2

創建返回JSON數據的MySQL數據的方法的第一步是正確的。然而究竟是還是完全取決於你!您會發現JSON是一種非常靈活的格式,它允許您在響應中放入幾乎任何格式的數據。這可能是有道理的,取決於你想要做什麼,在你的PHP模塊中有幾種方法返回不同的東西。例如,如果您有書籍數據庫,也許您想要創建一種方法來允許您指定作者,並且將返回一個JSON響應以及該作者編寫的數據庫中的所有書籍。

你可以使用的HttpRequest實際執行調用你的模塊,但我發現了對象 - NSURLRequest很容易使用:

NSURLRequest *request = [NSURLRequest requestWithURL: 
         [NSURL URLWithString:@"http://yoururl/books/38917"]]; 
[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

不要以爲你必須手動解析JSON響應放入你自己的Objective-C對象中;這是一個非常普遍的任務,並且存在許多偉大的庫來這樣做。查看SBJSON框架中的this tutorial以查看最受歡迎的解決方案之一。

舉個例子,這裏是你如何解析JSON響應爲NSDictionary,便於穿越:

// Create SBJSON object to parse JSON 
SBJSON *parser = [[SBJSON alloc] init]; 

// parse the JSON string into an object - assuming json_string is a NSString of JSON data 
NSDictionary *object = [parser objectWithString:json_string error:nil]; 
+0

在url 38917這是什麼?方法? –

+1

這只是我編寫的一個數字,它是一個PHP模塊請求的示例URL結構。通常你會在URL請求中看到方法參數,所以我選擇的數字可以表示類似於數據庫中對象的唯一標識符。 –