为rails应用程序构建iphone客户端的最佳方法是什么?

为rails应用程序构建iphone客户端的最佳方法是什么?,iphone,ruby-on-rails,objective-c,xml,rest,Iphone,Ruby On Rails,Objective C,Xml,Rest,我有一个相当标准的rails应用程序,希望能够从iPhone应用程序访问基本的CRUD(创建、更新、删除)操作以及我添加的查询。Rails为这些操作提供了RESTAPI,或多或少是现成的 在iphone上处理REST/XML部分的最佳方法是什么?有没有什么好的objective-C库已经完成了这类工作?这些操作还需要与特定用户关联(即经过身份验证)。最好的办法是围绕NSURLConnection编写一个简单的包装类,为API设置特定的内容。它并不特别复杂,而且它允许您直接将类的API定制为目标的

我有一个相当标准的rails应用程序,希望能够从iPhone应用程序访问基本的CRUD(创建、更新、删除)操作以及我添加的查询。Rails为这些操作提供了RESTAPI,或多或少是现成的


在iphone上处理REST/XML部分的最佳方法是什么?有没有什么好的objective-C库已经完成了这类工作?这些操作还需要与特定用户关联(即经过身份验证)。

最好的办法是围绕NSURLConnection编写一个简单的包装类,为API设置特定的内容。它并不特别复杂,而且它允许您直接将类的API定制为目标的RESTAPI。类可以有一个init方法,如
initWithMethod:delegate:params:
,其中委托是希望异步接收结果的对象,而params是所有参数的NSDictionary。您还可以使用类上的属性设置身份验证(或让类在您登录后自行发现并记录身份验证)


至于解析XML,我建议您签出。

如果您不喜欢解析XML(谁喜欢呢?),并且可以将后端配置为吐出JSON而不是XML,我强烈建议使用库,例如。将数据读入对象比通过XML节点解析要容易得多。

我在使用plists时运气不错

您需要安装plist-3.0.0 gem(gem安装plist IIRC)

然后在控制器中设置如下内容:

plist = {'a'  => 'b', 'c' => 'd', 'e' => {'f' => 'g', 'h' => {'i' => 'j'}}}.to_plist
render(:text => plist)
NSURL *url = [NSURL URLWithString:@"http://somewhere.com"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response;
NSError *error;
NSData *plistData;
plistData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSPropertyListFormat format;
NSString *errorStr;
id imagesToRate = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorStr];
if(!imagesToRate) {
    NSLog(errorStr);
} else {
    NSLog(@"%@", [imagesToRate objectForKey:@"e"]);
}
然后在iphone应用程序中设置如下内容:

plist = {'a'  => 'b', 'c' => 'd', 'e' => {'f' => 'g', 'h' => {'i' => 'j'}}}.to_plist
render(:text => plist)
NSURL *url = [NSURL URLWithString:@"http://somewhere.com"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response;
NSError *error;
NSData *plistData;
plistData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSPropertyListFormat format;
NSString *errorStr;
id imagesToRate = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorStr];
if(!imagesToRate) {
    NSLog(errorStr);
} else {
    NSLog(@"%@", [imagesToRate objectForKey:@"e"]);
}
您几乎可以自由地使用json(如中所示,您不必使用自己的xml方案来格式化数据,序列化就像to_plist调用一样简单)此外,sdk还提供了用于处理plist的本机代码


但是,如果您已经准备好了一个以json/xml输出的web服务,那么您可能希望保留它,并使用前面提到的内容(TouchXML,json框架)在iphone上解析这些内容。

我最近编写了一个使用NSURLConnection的TouchJSON示例。这是非常基本的,但应该足以让您开始asych加载


这对我来说是一个常见的问题,以至于我一直在研究Rails ActiveResource框架的一个端口,名为

到目前为止,我们已经发布了两个版本的项目。应用商店中的一些应用程序已经在使用1.0,并且可以处理Rails内置的默认to_xml和to_json资源处理。1.01是一个错误修复版本和一个插入式升级


我们目前正在为1.1定义功能集。我们已经并且正在使用。

在iPhone上使用NSURLConnection时要小心。众所周知,它存在内存泄漏,这会使应用程序很快崩溃。如果您正在处理大量HTTP请求,不要期望NSURLConnection为您工作。找一些其他的东西,可能是一些卷曲包装器。

听起来很有趣,因为如果不需要的话,我不想在电话上进入XML……有没有办法指定在发出请求时需要plist结果(就像rails对XML所做的那样?)。或者您只是提供不同的api端点/参数来指定您希望结果作为plist?您可以使用一些神奇的路由来调整给定操作的url,强制使用特定的格式,然后在控制器中使用responses\u进行处理。或者,正如你所说的,为plist的东西使用一个专用的端点(我就是这么做的)听起来很有趣,我也会检查一下。我看得越多,就越喜欢它。我先试试这个。