【发布时间】:2011-05-08 08:46:25
【问题描述】:
我有一个数据版本控制系统,在某些 RDBMS 中实现为时间点架构。我正在编写一个基于 servlet 的 API 来公开有关此数据的一些功能。 API 将向用户返回数据点,允许用户标记数据以进行删除,并允许超级用户接受或拒绝这些数据修改请求,这也是通过 API 调用完成的。
问题来了。我已经处理了一些大型且值得注意的 API,这些 API 具有非常多样化的功能集,其中所有 API 调用都是 HTTPS GET。这就是我打算这样做的方式。我知道我知道,在一个完美的世界里,如果你正在开发一个面向资源的产品,你应该设计一个实现为 REST 接口的 ROA。然而,客户真的希望有一个更加混合的 RPC 风格的界面,以提高可读性和低学习曲线。如果我在 GET 方面做所有事情以获取客户端想要的格式的 API 调用,这是一件坏事吗?以后有什么东西会回来咬我吗?对未来的 API 添加或维护有不良影响吗?如果这种方法存在一些明显的缺陷,客户可以毫不费力地转向另一个方向。
我不想只做 REST 并使用 GET/POST/etc http 动词的原因之一是较低权限的用户只能进行更改请求。这些会一直存在,直到更高权限的用户同意/拒绝它们。
示例调用: somehost/?Method=GetOutlierData&SiteId=112-1&TimeInterval=2011-01-01_00:00:00--2011-01-01_23:59:59&ValidDate=2011-02-01_12:00:00&ReturnType=RecordId&Requester=13&Password=secret&ApiKey=19483
回应: 返回=0&RecordsIds=
另一个我不确定我提出的是否是个好主意的地方是身份验证。每个调用都包括调用用户的凭据(以强制执行角色——某些用户只能使用一些 API 功能)。 API 将仅处理来自白名单上主机的调用,因此 API 的设计意味着客户端将构建一个端点来路由其所有组织的请求,并且该端点将提供秘密 API 密钥以及所有 API 调用.这将防止用户将自己未经批准的调用直接发送到 API。他们将在内部实施一些速率限制和禁止功能,以防止有意和意外的 DoS。既然我们是通过 SSL 运行的,那么这是一种适当的处理方式吗?
示例调用: somehost/?Method=blah&...&Requester=13&Password=secret&ApiKey=1298593
【问题讨论】:
-
我认为你的意思是 SOA :)
-
我真的在想,理想情况下,这将是一个面向资源的架构 (ROA),其中给定的 http 动词将确定资源是否会发生动作。然而,客户的整体要求使这变得困难。
-
明白了。我的错,把它回滚了。