为我的软件创建API - 基本代码结构

时间:2009-04-23 19:32:55

标签: api code-structure

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

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

或者直接开发API并从我的普通网络界面使用它?

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

4 个答案:

答案 0 :(得分:3)

做两次事情几乎总是一个坏主意 - 你可能最好不要实现API,向最终用户开放,也可以将它用于客户端代码,还有一些额外的东西钩子这是特定于接口的。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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

当然,我只处理了insertupdate的情况。你需要什么调用这些函数是一些方法拆分器,它知道远程api何时调用insert而不是delete并相应地调用不同的函数(同样适用于Web)接口)。如果您使用的是Web框架,那么很可能是您的Web界面部分的urlconfig。

答案 3 :(得分:1)

REST几乎已成为为客户提供网络API的标准,并为您提供了很多灵活性。权力也是如此。如果您正在使用.net平台,您实际上可以使用ASTORIA [ADO.Net Data Services],它通过简单地映射您的数据库对象来生成基于REST的Web服务。