iphone&休息网络服务 - 最佳做法是什么?

时间:2010-09-25 01:05:36

标签: iphone web-services model communication

我正在开发一个使用php web服务实现所有功能的iphone应用程序。 我正在计划创建模型对象以便在我的UI和Web服务之间进行通信。

在php上创建模型类以便在我的iphone模型和数据库之间进行通信是否更好?或者可以直接从数据库与我的iphone模型类进行通信吗?

以下哪一项是处理此通讯的正确方法?

  • iphone-ui- => iphone-model-classes =>网络服务==>数据库
  • iphone-ui => iphone-model-classes => php-model-classes =>网络服务==>数据库

1 个答案:

答案 0 :(得分:0)

为什么要使用PHP?只需使用相关的数据库库,直接从设备连接到数据库!

为什么你可能想要在手机和数据库服务器之间放置一些东西有很多原因:

  • 验证
  • 数据验证/完整性检查
  • 记录/审计
  • 架构更改

成熟的模型类可能看起来有点重量级(特别是因为PHP不会缓存任何东西),但是您需要决定如何在服务器端执行操作。特别是,您可能希望使用模型类和持久层来避免直接处理Sqlite / MySQL / Postgres / ODBC / blah。

还有很多理由说明PHP不是Web服务的最佳语言......

编辑:我在玩Devil的倡导者。

与数据库的“连接”通常只是一个TCP连接(尽管几乎所有现代POSIXish DB都支持通过Unix套接字连接,这有点更安全)。您通常需要实现DB的协议;最简单的方法是使用DB提供的C库(用于Postgresql 8.4的libpq5,用于MySQL 5.1的libmysqlclient16等)。我很确定默认情况下iOS不包含它们(但是IIRC旧版本的OSX曾经和Postgres一起使用)。

但是,出于安全原因,这非常糟糕:

  • 大多数Linux发行版将数据库服务器配置为仅在Unix套接字上侦听(即无法通过localhost连接到它们)。控制访问权限要容易得多(只有能够访问该文件的人才能连接),并且允许简单的身份验证(您可以在连接的另一端获取进程的用户ID,这意味着您不需要密码 - 这是Postgres的默认配置。)
  • 大多数允许通过TCP连接的配置都是这样做的,因为Java DB库通常不支持Unix套接字(因为“纯Java”实现应该具有优势,尽管使用Unix套接字需要少量的本机代码)。通常,这些只允许来自localhost的连接(不是互联网上的随机位置)。
  • 如果您对整个互联网对相关表格具有只读权限感到满意,那么这可能是明智之举。否则,您将需要某种访问控制:
    • 允许更广泛的Internet写入您的数据库是不好的。您不能只在您的应用中嵌入密码;该应用程序将在几天/几周内破解,如果攻击者充分好奇,将提取密码。
    • 数据库访问控制是按每个数据库或每个表,而您希望控制每行访问(即用户可以在“users”表中看到自己的行,但不能看到其他用户的行).data对于其他用户)。
    • 数据库服务器通常不对帐户登录进行任何形式的速率限制,这使得进行在线暴力攻击变得微不足道。

同样,很少希望手机直接与数据库对话。这意味着当您更新架构时,您的应用程序将停止工作(禁止使用;您不应强制用户升级)。有可能将一些视图/触发器/等组合在一起作为兼容层。恶心。

其次,关系数据库通常不适合真正的应用程序。您想要向下滚动表格视图。每个单元格都从数据库行加载。每一行都通过网络加载......哎哟。 (使用CoreData 一次之后,我永远不想回头。它让我的生活变得更轻松。虽然我不会在服务器端使用它(我们的服务器运行Debian,我们的web服务大多是用Python),如果我要在Objective-C中编写应用程序,Core Data不再添加任何供应商锁定 - 我不认识任何认真对待GNUstep的人。

相反,它有助于考虑您要向Web客户端呈现的API。大多数网络服务(Facebook,Twitter,可能是其他网站)似乎都呈现出一种相当“愚蠢”的平面世界模型。编写最简单的东西,允许您实现所需的API。这可能意味着如果它足够容易使用模型类(Google App Engine的建模抽象很好;基于Django的建模抽象,显然)。