6

我的公司即将从头开始重新设计一个大项目。我们目前正在考虑如何实现数据提供者。在过去的几个月里,我曾经集成一些 Web 服务,并且非常喜欢以这种方式处理数据。所以我在考虑一个 RESTful 设计。我们将使用带有 REST 支持的 ColdFusion 10,但我实际上不喜欢它所需的组件结构。

最大的优势可能是我们将能够使用 REST 为我们所有的平台提供数据,即:网站、移动网站和 iOS/Android 应用程序。我的安全方法如下:任何人都可以访问公共数据(显然)。只能使用 BasicAuth 访问私有数据。使用 BasicAuth 还允许我们拥有具有不同访问级别的用户角色。授权将是隐式的,并且基于会话/登录。

<!--- server-side example to request customer information (private data, BasicAuth required) --->
<cfset requestedID = 123>
<cfhttp url="/customer/#requestedID#" method="get" username="#APPLICATION.REST_SYSTEMUSER#" password="#APPLICATION.REST_SYSTEMUSER_PW#">
    <cfhttpparam type="url" name="includeAddresses" value="true">
</cfhttp>

<!--- successful response in JSON --->
{
    "ID": 123,
    "FirstName": "John",
    "LastName": "Doe",
    "Birthday": "1970-01-01",
    "BillingAddress": {
        "Receiver": "John Doe",
        "Street": {
            "Name": "Main Street",
            "Number": "13",
            "Addition": ""
        }
        "City": {
            "ZipCode": "AB-123",
            "Name": "Sampletown",
            "District": ""
        }
    },
    "ShippingAddresses": [
    ]
}

<!--- deserialize JSON and build an object to use server-side (the constructor wraps the data and adds functions to it) --->
<cfset customerJSON = deserializeJSON(CFHTTP.FileContent)>
<cfset customer = createObject("component", "Customer").init(customerJSON)>

以下是我想到的问题

  1. 对每个页面上的所有内容都使用这种通用的 REST 方法是否明智?(开始在网站上使用 REST 是否明智?)
  2. 本地 HTTP 请求会影响性能并减慢页面加载速度吗?
  3. BasicAuth 是否足以保护数据?(我只会添加一些次要的安全功能,例如请求垃圾邮件保护)
  4. 是否最好避免在 Web 服务中存在依赖关系,例如 /customer/访问/address/以接收其数据?

在其他一些(较旧的)网站上,我们有基于文件的数据提供程序(包括和负责数据库访问等的组件),但我们遇到了一些更复杂的页面(例如结帐过程)的问题,例如名称冲突通过包括,不透明和沉重的组件,混合模型/视图/控制器元素等。

4

3 回答 3

4

这是我的答案,基于我最近所做的研究。我的公司正在研究新产品的开发,所以我问了很多和你一样的问题。REST API 的概念也非常吸引我们,它不仅可以支持前端,而且还可以成为其他应用程序的集成点。我们为其他产品维护了一个单独的 API,如果您不小心,它很容易与主应用程序失去同步。

  1. 使用 REST/单页方法是否明智?当然可以。许多大型网站都是这样工作的。似乎很常见的是一种混合方法,其中服务器可以为初始页面生成 HTML,可能显示 10 种产品),但移动到接下来的 10 种产品将通过 RESTful 调用和客户端呈现。这可能会为您提供最佳的客户体验,但构建两个不同的模板(服务器端模板和客户端模板)的成本很低。根据您的网站的工作方式和使用者,这可能需要也可能不需要。例如,GMail 是一个单页应用程序,但它是一个应用程序,您可以容忍它花几秒钟的时间向您显示加载栏,而在运行零售网站时,这种延迟可能是不可接受的。

  2. 本地请求会减慢加载速度吗?您的意思是让您的网站进行 REST 调用以获取其数据,而不是直接访问数据库吗?在这种情况下,它会增加一些延迟,因为涉及额外的网络跃点,但在设置良好的系统和部署中,我认为延迟可能是可控的。

  3. HTTP 基础。我只会通过 HTTPS 考虑它。它只是通过 HTTP 不够安全。我在下面链接到的演示文稿中对此进行了介绍。

  4. 相关数据。我也想知道这一点。我非常有帮助的是观看StormPath 的演示文稿,其中涵盖了实现 RESTful API 时的许多问题和良好实践。它们涵盖了一种链接数据的方法(遵循 HATEOAS 原则)以及实体扩展,因此 GET/customers/ID123?expand=address将返回客户的表示,但嵌入了他们的地址,这是避免多次往返以获取所有信息的好方法您需要的数据。

关于 CF10 的 REST 支持。我看着它,并没有那么热衷于它是如何工作的。我可能误解了它,但 REST 应用程序似乎与您尝试混合的任何常规应用程序非常分离。Railo 的实现看起来非常相似,但略有不同。当然,构建一个适用于两者的 REST 应用程序似乎相当棘手。你有看过太妃糖吗?我没有,但会对它的工作原理感兴趣。

因为 REST 是一种架构风格,而不是一个严格的标准,所以对于你如何实现事物有很大的自由度,以及关于“最佳”方法的辩论/争论的空间很大

于 2013-05-16T21:48:51.403 回答
1

我最近遇到了一个名为 Taffy 的项目,它是一个用于在 ColdFusion 中编写 REST API 的框架。它适用于 CF8-10 和 Railo。我对它如何构建代码以及编写每个 REST 端点变得多么容易印象深刻。您可能还希望查看该项目以及后端。

于 2014-04-10T21:31:37.870 回答
1

对每个页面上的所有内容都使用这种通用的 REST 方法是否明智?(开始在网站上使用 REST 是否明智?)

我不确定,但困扰我的一件大事是 CF10 中的 REST 调用如何绕过onError错误处理程序。这是已标记为Fixed的错误报告,但谁知道我们什么时候会真正得到它。CF11?我不知道,问 Adob​​e。

这真的很糟糕,因为除了在客户端获得 5xx 错误代码之外,人们可能永远不知道到底出了什么问题。

本地 HTTP 请求会影响性能并减慢页面加载速度吗?

当然可以。我认为如果 web 和 RESTful API 前端在服务层调用相同的方法会更好。

BasicAuth 是否足以保护数据?(我只会添加一些次要的安全功能,例如请求垃圾邮件保护)

通常是的,如果是 HTTPS。取决于什么是“足够的”。

最好避免像 /customer/ 访问 /address/ 以接收其数据之类的 Web 服务中的依赖项?

同意barnyr,请阅读他的回答。

最后,只是想指出,除了 CF10 的官方实现之外,还有像TaffyColdBox这样的框架可以在没有 CF10 的情况下处理 RESTful API。

另外,请查看CF10 RESTful API 可以做什么而 Coldbox RESTful API 不能做什么?反之亦然?

于 2014-04-10T21:58:43.550 回答