2013-01-03 70 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请求中看到方法参数,所以我选择的数字可以表示类似于数据库中对象的唯一标识符。 –