Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为我的软件创建API-基本代码结构_Api_Code Structure - Fatal编程技术网

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

为我的软件创建API-基本代码结构,api,code-structure,Api,Code Structure,我目前正在编写一个web软件,它也将通过API供客户端桌面使用。 我现在面临的问题是:我是否应该在应用程序中实现添加/更新/删除对象的每个操作两次?一次是因为它位于普通代码中,一次是为了API而隔离的 或者我更应该使用一个OOP模型类系统来表示数据库中的所有对象,并将它们用于API和普通代码 或者直接开发API并在我的普通web界面上使用它 这是我一直想知道的事情。提前谢谢 做两次几乎总是一个坏主意——您最好实现API,向最终用户开放它,并将其用于客户端代码,为特定于接口的内容提供一些额外的钩子

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

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

或者直接开发API并在我的普通web界面上使用它


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

做两次几乎总是一个坏主意——您最好实现API,向最终用户开放它,并将其用于客户端代码,为特定于接口的内容提供一些额外的钩子。

这就是为什么我们有REST(和SOAP)协议

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


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

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

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

我倾向于将前两种方法结合起来。每次保存对象时,肯定会有一些操作发生。把它们放在
save()
方法中(或者
update()
insert()
如果你想进一步分解的话)。您不应该考虑两次实现此功能

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

也可以将验证视为与反序列化固有的不同,并认为某些规则将是相同的,而其他规则将是不同的。例如,在web界面中,我知道当我收到故事时,我会自己标记

修改时间
,而对于远程API,我相信客户端会标记时间。这是故意的。另一方面,任何没有标签的故事都必须接收一个
default
标签,无论它来自何处。您可能更喜欢在对象构造之后让验证器对象只插入的自由

代码示例(在python中):


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

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

这也是我的问题。但是在正常应用中我会使用什么呢?它将是:主应用程序(在web上),它通过API与桌面应用程序链接。或者我应该将API视为DB的接口,而我的web应用程序也使用API来获取和检索数据?您肯定会选择第二种方法。如果你能将模型与其他组件分离,你就可以像使用winforms接口一样轻松地使用web接口。更不用说,当你以后需要重构时,你可以在API的掩护下完成所有这些,只要根据需要公开新字段——如果你使用紧密耦合的接口,然后,更改功能变得更加痛苦。
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