Web API设计技巧

9
我目前正在开发一个非常简单的网络服务,考虑编写一个API,这样当我决定在新平台上扩展它时,只需要编写解析器应用程序。也就是说,该API并不是为其他开发人员而设计的,而是为了我自己,但我不会限制对其的访问,因此任何人都可以在此基础上构建。

然后我想甚至可以通过这个API运行网站本身,出于各种原因,如降低带宽消耗(在浏览器中生成HTML)和客户端缓存。看起来像是更重要的AJAX原因。

布局如下:

Server (database, programming logic)
|
API (handles user reads/writes)
|
Client application (the website, browser extensions, desktop app, mobile apps)
|
Client cache (further reduces server reads)

在介绍之后,以下是我的问题:
  1. 这是否是API的良好使用
  2. 将整个网站通过API运行是否是个好主意
  3. 在使用API时,我有哪些安全认证选择(由于某种原因,我不想使用HTTPS)
编辑

附加问题:

  1. 我没有考虑过哪些替代方法
  2. 使用这种方法可能会出现哪些我没有考虑到的潜在问题
2个回答

17

首先说一下,问一个设计或任何事情是否“好”取决于您如何定义“好”。典型的标准包括性能、可维护性、可扩展性、可测试性、可重用性等。如果您能添加一些这方面的背景信息,则会有所帮助。

话虽如此...

这是一个好的 API 使用方式吗?

将业务逻辑、呈现逻辑和数据持久性逻辑分开通常是一个好主意。您的设计做到了这一点,因此我很乐意称它为“好”。您可以查看一个正式的设计模式来实现这一点——目前的默认值可能是模型视图控制器,特别是对于 Web 应用程序。

通过 API 运行整个网站是一个好主意吗?

嗯,这取决于应用程序。完全使用 Javascript/Ajax 编写应用程序是完全可能的,但是存在浏览器兼容性问题(特别是对于旧版浏览器),而且您必须构建支持用户从 Web 应用程序中通常期望的内容,比如深链接和搜索引擎友好性。如果您有一个良好分层的 API,您可以在服务器上生成部分页面,如果这使其更容易。

在不使用 HTTPS 的情况下,我可以使用哪些安全身份验证选择来使用 API?

比较棘手——对于这种应用程序,您必须区分用户认证和应用程序认证。对于前者,OpenID 或 OAuth 可能是主要解决方案;对于后者,请查看谷歌如何要求您注册以使用其地图 API。

在大多数 Web 应用程序中,HTTPS 不用于身份验证(证明当前用户是他们所说的那个人),而用于加密。这两者相关,但绝不等效...

有没有其他我没有考虑过的替代方法?

也许这更适合问题5 - 但根据我的经验,API设计是一项相当玄学的技能 - 对于API设计师来说,很难准确预测API客户端所需的内容。我会认真考虑在为第一个客户端平台编写应用程序时不使用API,并稍后将API分离出来 - 这样,您只构建第一版所需的部分。

我还没有考虑到哪些潜在问题可能会出现

版本控制是API中的重要问题 - 一旦创建了接口,几乎无法更改,特别是对于您无法控制的多个客户端。我会将版本控制作为一流概念构建 - 对于RESTful API,您可以将其作为URL的一部分进行操作。


嘿,感谢你的好答案!我不关心旧浏览器和搜索引擎,因为整个网站都是一个带有登录功能的索引,用户在那里不会看到彼此的信息(而且大多数情况下也不想让他们的信息被看到 - 尤其是搜索引擎)。至于身份验证,我主要想知道如何与用户保持身份识别。我在想 - 用户登录>服务器给他他的会话ID>用户每次联系服务器时发送他的SID。或者也许服务器发送一些字符串,用户根据某些规则回复另一个字符串,等等。 - Alexander Ivanov

-2
  1. 这是 API 的好用法吗?

    这取决于您将如何使用该应用程序。

  2. 通过 API 运行整个网站是个好主意吗?

    不是,因为您的网站只能通过您的应用程序访问。这种实现方式会防止与其他浏览器兼容。

  3. 我在使用 API 时有哪些安全认证选择(由于某种原因,我不想使用 HTTPS)?

    您可以使用 omniauth

  4. 还有其他我没有考虑过的替代方法吗?

    创建两个前端,一个在您的应用程序中,另一个在常见浏览器中。

  5. 使用这种方法可能会出现哪些我没有考虑到的潜在问题?

    我不知道您的想法,但我看不到任何重大危险。


2
这怎么成为兼容性问题了呢?如果我在我的API上制作一个跨浏览器兼容的Web应用程序,那就没问题了。我的整个想法是提供一个基本页面,并使用AJAX实现JS中的API解析器来运行该站点。这样,该站点将不会集成到服务器中,如果有人喜欢,他们可以在其服务器上创建一个通过我的API运行的站点。整个重点是,即使保存网页并进行缓存,这种方法仍将起作用,甚至可以离线工作。 - Alexander Ivanov
  1. 我还有其他方法可以进行身份验证吗?我想在我的服务器上完成它,而不使用第三方服务。
- Alexander Ivanov
你打算只创建一个网页来控制所有请求吗?这不太好。如果你用ajax创建每个页面,为什么不让用户静态调用那个页面呢?这对他来说很容易(只有一个工作线程处理),对你来说也很容易(只有一次访问你的服务器)。 - Nicos Karalis
OAuth不是第三方,而是一个认证的设计模式,它是使用API的好方法。看看Twitter认证:您有一个令牌和一个令牌密钥,服务器进行计算以进行认证,我无法更好地解释OAuth,但它比纯认证更好,因为您不会通过post或get发送密码(我们可以检索这些详细信息),并且您可以基于OAuth创建自己的认证。 - Nicos Karalis
如果你仍然不了解OAuth的好处,请查看这里:OAuth explained,不要尝试使用一些库,尝试实现它,它很容易,并且你可以找到许多有用的链接。 - Nicos Karalis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接