0

我目前正在编写一个 Web 软件,客户端桌面也将通过 API 使用该软件。我现在面临的问题是:我是否应该在应用程序中执行两次添加/更新/删除对象的每个操作?一旦它位于普通代码中并且曾经为 API 隔离?

或者我应该更愿意使用代表我数据库中所有对象的 OOP 模型类系统,并将它们用于 API 和普通代码?

还是直接开发 API 并在我的普通 Web 界面中使用它?

这是我一直想知道的事情。提前致谢!

4

4 回答 4

3

做两次事情几乎总是一个坏主意——你可能最好实现 API,向最终用户开放,并将其用于客户端代码,并为接口的东西添加一些额外的钩子-具体的。

于 2009-04-23T19:37:32.020 回答
2

这就是我们拥有 REST(和 SOAP)协议的原因。

桌面向您的 Web 应用程序发出 RESTful 请求。您的 Web 应用程序接收 REST 请求并执行实际工作。

您的代码只存在于一个地方——网络。

于 2009-04-23T19:46:31.810 回答
2

首先让我说我的经验是使用 Django,它是一个已经提供 ORM 的富 Web 框架。我必须创建模型来代表我的对象;我不执行原始 sql。

所以我自然会推荐你的第二种方法。马上我会说你的第三种方法会让人头疼。为什么?因为你会想要做不同的后期处理。这就是游戏的本质。当您在 Web 上建立一个 CRUD 界面时,一些内容将作为字段存储在您的模型中,用户甚至无法从 CRUD 页面中识别出来。例如,我有一个 CRUD 页面,其中包含与不同公司相关联的新闻报道。(这是一个数据库外键。)当然,这是由登录信息自动提供的。但是登录网页的过程(以及登录的存储位置)将与远程 API 的过程大不相同。

我的偏好是将您的前两种方法中的一点点结合起来。每次保存对象时肯定应该发生一些动作。把它们放在一个save()方法中(或者update()如果insert()你想把事情分解得更多)。您不应该考虑两次实现此功能。

但是,反序列化/对象构造和验证在 Web 界面和远程 API 中会发生不同的情况。这确实应该单独实施。

人们也可能将验证视为与反序列化本质上不同,并认为某些规则是相同的,而另一些则不同。例如,在 Web 界面中,我知道当我收到故事时,我会标记modification_time自己,而对于远程 API,我相信客户端会标记时间。这是故意的。另一方面,任何没有标签的故事都必须收到default标签,无论它来自哪里。您可能更喜欢在对象构造之后自由地制作验证器对象。

一个代码示例(在 python 中):

def handle_remote_update(serialized_object):
    #do some parsing
    model_object = ModelObject(...)#fill in with parsed values
    validator1.validate(model_object)
    validator3.validate(model_object)
    model_object.save()#All database code is in this method
    #If you have to log to your system or notify listeners, that's also in this method

def handle_web_submission(post_dict):
    #do some parsing
    model_object = ModelObject(...)#fill in with parsed values
    validator2.validate(model_object)#This wasn't executed above
    validator3.validate(model_object)#This was
    model_object.save()#Same code gets executed down here as above

当然,我只处理了insert或可能的情况update。您需要调用这些函数的是一些方法拆分器,它知道远程 api 何时调用以及相应地调用不同的函数(insert对于deleteWeb 界面也是如此)。如果您使用的是 Web 框架,这很可能是您的 Web 界面部分的 urlconfig。

于 2009-04-23T19:59:09.703 回答
1

REST 几乎已成为通过 Web 为客户端提供 API 的标准,并且还为您提供了很大的灵活性和功能。如果您在 .net 平台上工作,您实际上可以使用 ASTORIA [ADO.Net Data Services],它通过简单地映射您的数据库对象来生成基于 REST 的 Web 服务。

于 2009-04-24T06:06:27.780 回答