【问题标题】:iPhone: How to get data from a web application?iPhone:如何从 Web 应用程序中获取数据?
【发布时间】:2010-12-31 11:43:53
【问题描述】:

对不起,如果这是一个愚蠢的问题,但我是新手。

我开始使用 iPhone 应用程序开发,并想创建一个涉及从 Web 服务中提取数据的应用程序。

假设 url 是 http://myapp.com/api/people/fetchall,它返回 XML 数据。

  • 如何将这些数据导入我的 iPhone 应用程序?

更新:在做了一些研究后,我决定(在服务器端)我想实现一个返回 JSON 的RESTful API。所以我的 iPhone 应用程序最终将成为一个 REST 客户端。

资源:

到目前为止,我发现以下是一些有用的链接:

【问题讨论】:

  • 这个问题有点过头了。您已经确定了您真正要问的各个问题(即,您知道如何“分解问题”),但最好将这些问题单独发布在 SO 上。实际上,您可以通过阅读文档(涵盖广泛的主题)来回答最后一个问题。其余的都是很好的个人 SO 问题。
  • 这个问题太宽泛了,因为有不同的理由选择不同的选择。多少数据?以后还要坚持吗?什么样的数据?等等。我建议你从 NSXMLParser 开始,尝试一个实现,然后在遇到它们时回来问更具体的问题。

标签: iphone objective-c api web-applications


【解决方案1】:

好的,你已经分解了要点,这是一个好的开始。

首先,Web 应用程序需要其 API 以客户端可以轻松解析的格式返回数据,无论它们是 iPhone 应用程序还是其他任何应用程序。出于这个原因,许多 Web 应用程序使用 JSON 或 XML。 HTML 不是传输数据的好格式,HTML 适合标记要呈现的文本。

首先,编写您的 Web 应用程序以返回 XML 或 JSON 格式的响应。如果您有时间,您可以让您的 Web 应用同时执行这两项操作,并指定您希望响应采用哪种格式作为参数。

要将数据从网络应用程序下载到您的 iPhone 应用程序,您需要建立一个 URL 连接并从您的一个 API 调用中下载数据。

例如,如果你的 API 有一个方法可以返回用户的一些信息,你需要在你的 iPhone 客户端构建一个 http 请求,并通过 API URL 将它发送到服务器,指定是否是 GET 或 PUT 或其他类型的 http 请求。

有趣的类是NSURLRequest,它是可变的对应物,NSURLConnection,它是委托协议,NSURLConnectionDelegate

解析数据取决于它的格式。对于 XML,您可以使用 iPhone SDK 中提供的 XML 解析器,NSXMLParser

如果您要使用 JSON,您可以使用 iPhone 上可用的 JSON 解析库之一。就个人而言,我使用过TouchJSONJSON-Framework

要填充表格视图,您需要实现UITableViewDataSource 方法中的几个方法,以及UITableViewDelegate 中的一些方法。阅读 UITableView 类和上述协议的文档应该会给你足够的信息来开始使用它们。

我希望这对您有所帮助,并为您提供了解更多信息的起点。

【讨论】:

  • 对不起,这是一个错字。我的意思是说“我认为 XML 更容易使用”
【解决方案2】:

看看Three20 项目——Facebook iPhone 应用程序的开发者 Joe Hewitt 将他的许多工作开源,包括一个可以使用来自网络的数据填充自身的表格视图类。

【讨论】:

    【解决方案3】:

    很简单... 这里有几个链接可以帮助您入门 http://mobiledevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

    本教程将告诉您如何在您的 plist 文件中进行必要的更改,以及如何告诉您的应用程序从 URL 启动。其次,代码需要在你的应用委托类的方法中完成,命名为:

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
    

    从 url...获取您需要的所有信息并从中调用 JSON Web 服务。调用 JSON 的示例如下:

    [[AFCoVuAPIClient sharedClient] getPath:@"whatever.json"
                                             parameters:[NSDictionary dictionaryWithObject:loginSessionKey forKey:@"login_session_key"]
                                                success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                                    NSLog(@"Did logout successfully on app termination");
    
                                                    [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform
                                                    background_task = UIBackgroundTaskInvalid; //Invalidate the background_task
                                                }
                                                failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                                    NSLog(@"Did NOT logout successfully on app termination");
                                                }];
    

    你可以将数据保存在你的单例类中

    你的 AFCovuAPIClient 类 .h 文件的样子

    #import "AFHTTPClient.h"
    
    @interface AFCoVuAPIClient : AFHTTPClient    
    
    +(AFCoVuAPIClient *)sharedClient;
    
    @end
    

    和 AFCOvuAPIClient.m 文件看起来像这样 #import "AFCoVuAPIClient.h"

    #import "AFJSONRequestOperation.h"
    
    @implementation AFCoVuAPIClient
    
    +(AFCoVuAPIClient *)sharedClient {
    static AFCoVuAPIClient *_sharedClient = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _sharedClient = [[AFCoVuAPIClient alloc] initWithBaseURL:[NSURL URLWithString:@"url goes here"]];
    });
    
    return _sharedClient;
    }
    
    -(id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (!self) {
        return nil;
    }
    
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    
    [self setDefaultHeader:@"Accept" value:@"application/json"];
    
    return self;
    }
    
    @end
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多