【问题标题】:iphone & rest web service - what is the best practice?iphone & rest 网络服务 - 最佳实践是什么?
【发布时间】:2010-09-25 01:05:36
【问题描述】:

我正在开发一个 iphone 应用程序,它使用 php 网络服务来提供所有功能。 我正计划创建模型对象以在我的 UI 和 Web 服务之间进行通信。

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

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

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

【问题讨论】:

  • 您希望能够在 php 中访问(排序、分析、处理)您的模型数据吗?
  • 不,我只是希望能够从数据库中读取一些数据,并将一些数据插入到数据库中。 php 应该只负责传输我的数据

标签: iphone web-services model communication


【解决方案1】:

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

您可能希望在电话和数据库服务器之间放置一些东西的原因有很多:

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

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

PHP 不是 Web 服务的最佳语言还有很多原因...

编辑:我在玩恶魔代言人。

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

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

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

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

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

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

【讨论】:

  • "只要使用相关的数据库"你能提供更多的细节吗?是否真的可以直接连接到数据库(设备外部)!?!?!?!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2013-07-12
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多