【问题标题】:Where is the distinction between a web application and an API?Web 应用程序和 API 之间的区别在哪里?
【发布时间】:2020-02-21 17:19:02
【问题描述】:

这个问题与this over question 高度相关。我在问另一个问题,我仍然对这个话题有点困惑。

我遇到的问题

我目前有一个 Django Web 应用程序,用户可以在该应用程序中列出他们的爱好,并且可以在他们每次完成一项爱好时增加一个计数器。我的问题是,我想将此功能扩展到前端体验之外。换句话说,我希望用户能够使用POST 请求来增加他们的爱好,比如说,来自终端或来自他们自己的脚本或其他东西。

我感到困惑的地方

我是否必须为我的网络应用创建 API 才能添加此功能?

另一种说法是,我是否必须以不同于处理来自其他地方的请求的方式处理来自前端的请求?前端请求是否会转到 URL www.hostname.com/hobbies/1 而其他请求会转到 URL www.hostname.com/api/hobbies/1

如果我确实将POST 请求路由到与来自前端的请求相同的URL(即www.hostname.com/hobbies/1),那么google 怎么会有external APIs for Google Maps?似乎如果其他网络应用程序正在调用 Google 地图功能,那么 Google 已将这些实例与其前端分离。

【问题讨论】:

    标签: django api design-patterns web-applications


    【解决方案1】:

    我的问题是,我想将此功能扩展到 前端体验。换句话说,我希望用户能够 使用来自终端的 POST 请求增加他们的爱好 或来自他们自己的脚本或其他东西。

    我是否必须为我的 web 应用创建 API 才能添加此功能?

    很可能是的。这有几个原因:

    1) 由于 Django 的 CSRF protection,来自终端/脚本的 POST 请求很可能会在您的 /hobbies/1/ 端点上失败。对于应用程序外部的请求,您需要不同类型的 authenticationauthorization

    2) 来自终端/脚本的POST 请求最有可能将其内容编码为JSON,而通过html 表单提交的POST 请求将其内容编码为x-www-form-urlencoded。这需要完全不同类型的验证和错误处理作为响应,这导致我们进入 3)。

    3) 针对您的 /hobbies/1/ 端点的 POST 请求很可能会返回 HTML 响应,这不是您的终端/脚本想要接收的,它们很可能想要接收更结构化的数据类型,例如 JSON。

    结合 1) + 2) + 3) 的解决方案将为您提供/api/hobbies/1/

    【讨论】:

    • 是因为 POST 请求而将两者分开的唯一原因吗?为了实现这一点,似乎正在发生的唯一变化是我的服务层?我会简单地保持业务逻辑和一切相同,然后在服务层添加一个额外的组件来处理 API 调用,这个组件会调用与前端服务层组件相同的业务逻辑?
    • 这不仅仅是因为 POST 请求。如果您再次阅读 1) 和 2),您会发现 GET 请求也存在同样的问题。 API 视图是完全不同的野兽,你为什么要把事情复杂化而不是保持简单呢?无论如何,业务逻辑不属于视图,它需要保留在模型中,以便被 Django 视图或 API 视图重用。
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 2011-01-24
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2017-12-04
    • 2017-09-26
    相关资源
    最近更新 更多