我的基于 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 吗?