我的基于 Web 的应用程序应该成为我的 api 的消费者吗?

Posted

技术标签:

【中文标题】我的基于 Web 的应用程序应该成为我的 api 的消费者吗?【英文标题】:Should my web based app be a consumer of my api? 【发布时间】:2011-03-02 19:41:36 【问题描述】:

我将很快开发一个移动应用程序 (iPhone) 和一个基于 Web 的应用程序 (Django)。对于移动应用,我将创建一个 REST api(很可能使用 Django)来从手机到服务器来回发送数据。

当我来创建基于 Web 的版本时,将其创建为 api 的任何其他客户端是否有意义。换句话说,移动应用程序和 Web 应用程序都将通过 HTTP 从外部 API 获取数据。或者基于 Web 的应用程序是否应该直接访问 api 正在使用的数据库并以这种方式获取其数据?

【问题讨论】:

【参考方案1】:

我将创建 Web 应用程序以将 API 提供给移动客户端。也就是说,让基于 Web 的应用程序直接访问数据库。这将简化您的 XML/JSON RESTful 资源访问。

【讨论】:

【参考方案2】:

把它分成三个“部分”。第一个使用 Python API 来操作数据库。第二个接口是你的 REST API 和你的 Python API。第三个讲网络并使用 Python API。

【讨论】:

【参考方案3】:

我会说不,不要使用 html 版本的 API。如果你设计好你的 Django,你最终可以得到比使用 HTML 版本的 API 更少的代码。每当老板希望更改某些内容的拼写时,您还可以保留让网页设计师使用 Django 模板的能力。

我建议尝试为您的 iPhone 应用程序定义一个基本应用程序以与之交互,然后在 HTML 版本的第二个应用程序中扩展它。 App1 将拥有您的所有模型(包括业务逻辑)和一个 views.py 用于处理传入/传出 iPhone 的数据。然后创建App2,它使用App1.models,但创建自己的views.py。运气好的话,您会发现自己除了用于呈现输出的模板外,什么都不更改,因此您可以通过将模板作为参数传递来重用您的视图。

例如:

App1.views:

def list(request, template="list.json"):
    list = Model.objects.filter(deleted=False).filter(user=request.user)
    list.reverse()
    ## Lots of other logic to work on the list.
    return render_to_response(template, list: list,)

App2.views:

def list(request, template="list.html"):
    return App1.views.list(request, template=template)

【讨论】:

【参考方案4】:

我认为这个问题的答案随着时间的推移而改变。一年前,当被问到这样做可能仍然太麻烦时,但现在我肯定会说是的 - 使用您的 API 作为基础是明智的做法。随着网站使用更多的 HTML5 和移动应用程序变得更智能,让所有“UI”从同一个 API 层读取/写入真的很有意义。这将在未来为您提供更大的灵活性。

【讨论】:

以上是关于我的基于 Web 的应用程序应该成为我的 api 的消费者吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该为我的 POS Web 应用程序使用构建 API 吗?

API 使用约定

如何从另一个应用程序调用我的基于角色的授权 Web API?

我应该输入什么URI来运行我的Web API2?

我的 Web Apps API 是不是需要 Oauth2

使用 IdentityServer4 对 Web API 进行基于角色的授权