Objective-C:在您的iPhone上访问REST API的最佳方法

30

我已经苦恼了一段时间。我正在尝试在我的 iPhone 上访问一个 REST API,偶然发现了 ASIHTTP 框架可以帮助我。因此我做了这样的事情:

//call sites, so we can confirm username and password and site/sites
NSURL *url = [NSURL URLWithString: urlbase];
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];
[request setUsername:@"doronkatz%40xx.com" ];
[request setPassword:@"xxx"];

urlbase是一个REST站点的URL时。

现在,开发人员告诉我这个框架可能存在问题或错误,它不能正确地传递标头。是否有另一种方法可以测试或访问带有身份验证的网络REST位置?


2
在回答这个问题之前,您需要格式化您的代码,以便SO可以正确地显示它。如果我能编辑的话,我会的,但是在您的每行代码前面放置4个空格,它就会看起来像代码。 - Topher Fangio
抱歉,伙计,我以后会注意的。 - Doz
请查看以下内容... http://odataobjc.codeplex.com/ - user359288
http://github.com/sdegutis/CocoaREST - indragie
http://github.com/mirek/NSMutableDictionary-REST.framework 很容易使用。 - Mirek Rusin
5个回答

33
我建议查看RestKit:http://restkit.org/。它提供了一个出色的API,用于访问RESTful Web服务并将远程资源表示为本地对象,包括将其持久化到Core Data中。HTTP身份验证已经被直接支持。

2
在0.20.0中,基本身份验证是如何执行的?我能找到的唯一例子与“RKClient”有关,但是在0.20.0中已被删除。非常感谢您的帮助。 - Brett Ryan

10

我刚开始学习iOS开发,并在过去的一个月中一直与本页面列出的一些重要框架进行斗争。实在是太恶心了。老实说,我建议你只使用AFNetworking或苹果自己的NSURLConnection来基础知识并自己动手做。

其中一个库已经不再维护。另一个最近进行了巨大的破坏性API更改,现在描述其使用的教程的一半都不再起作用。还有其他的库也非常庞大。

这比你想象的要简单。一些帮助我的资源:

仅在AFNetworking主页上的示例可能已经让您完成了80%。

更新: Mantle Framework(由Github Inc.开源)设计良好且易于使用。它处理对象映射:将JSON NSDictionary转换为您自己的自定义Objective-C模型类。它合理地处理了默认情况,并且很容易制作您自己的值转换器,例如从字符串到NSURL或从字符串到您的自定义enum


6
我有几个使用Objective Resource框架的应用程序,它提供了访问远程REST API的包装器。它主要针对基于Ruby on Rails的应用程序,因此其XML / JSON解析可能针对一些Rails默认值进行了调整,但值得一看。它默认支持基本的HTTP身份验证。

2

我刚偶然看到这个问题 - 你可能会发现LRResty很有趣,因为它使用了NSOperation、blocks等技术,请参见:GitHub 获取源代码(MIT许可证)。我正在进行实验 - 它也有一个示例应用程序。


1

到目前为止,我已经在两个应用程序中使用了ASIHTTP,并且没有遇到任何问题。

看起来你正在使用远程站点进行HTTP基本身份验证。尝试从标准浏览器访问相同的REST URL,并将所需的参数传递给它。它应该提示您输入用户名/密码。如果成功通过,则至少说明服务器端已设置好处理请求。如果没有,则需要与开发人员进行交流。

下一步要尝试的是放置一个基于Mac的网络嗅探器,并查看来回传输的标头。HTTPScoop、Wireshark或Charles中的任何一个都应该可以。将嗅探器作为网络代理运行,然后在模拟器中运行您的应用程序,并观察穿过的内容。再次尝试使用浏览器。一旦您看到差异,就可以使用ASIHTTPRequest上的addRequestHeader方法添加服务器期望的任何特定标头。


嗨,Ramin。我尝试使用 ASIHTTPRequest,甚至使用 Twitter api 来查看是否可以让头部工作,使用 addRequestHeader 并使用 HTTPScoop,但它并未显示传递到它的标头。 - Doz
你要查找哪些头文件?当你使用浏览器访问相同的URL时,是否在HTTPScoop中得到了你想要的内容?如果你能从浏览器中获取头文件但在ASIHTTP中却没有,那么你可能需要向开发者提交一个错误报告。 - Ramin
对于我正在处理的任何一个网站,使用HTTPSchool时都会收到需要身份验证的响应。对于Twitter,我可以将用户名和密码放在URL文件中,但是当我将其作为addRequestHeader添加时,HTTPSchoop并没有显示我已经添加了任何标头。这就是为什么我想知道ASIHTTP可能存在问题的原因。 - Doz
ASIHTTP支持使用您列出的API进行基本的用户名/密码身份验证。我认为,除非它是自定义身份验证方案,否则您不需要添加任何额外的标头。我建议您将问题重新发布到他们的Google组以获取具体帮助:http://groups.google.com/group/asihttprequest - Ramin
1
不幸的是,ASIHTTP已经不再维护了,作者建议您使用其他库。我认为这并不意味着“不要使用它”,但这是需要考虑的事情。请参见<http://allseeing-i.com/[request_release];>(链接包括分号) - Greg M. Krsak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接