我公司即将从零开始重新设计一个大项目。我们目前正在考虑如何实现数据提供程序。我过去几个月曾经整合过一些网络服务,就像用这种方式处理数据一样。所以我在考虑一个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)>
以下是我想到的问题:
/customer/
访问/address/
以接收其数据?在其他一些(较旧的)网站上,我们有基于文件的数据提供者(包括和负责数据库访问的组件等),但是我们遇到了一些问题,包括更复杂的页面(例如结帐流程)名称冲突通过包括,不透明和重组件,混合模型/视图/控制器元素等。
答案 0 :(得分:4)
根据我最近所做的研究,这是我的答案。我的公司正在研究新产品的开发,所以我一直在问自己很多相同的问题。我们也非常喜欢REST API的概念,它不仅可以支持前端,还可以成为其他应用程序的集成点。我们为其他产品维护了一个单独的API,如果你不小心的话,它很容易与主应用程序松开同步。
使用REST /单页方法是否明智?当然可以。许多大型网站都是这样工作的。似乎常见的是混合方法,其中服务器可以为初始页面生成HTML,可能显示10个产品),但是移动到接下来的10个产品将通过RESTful调用,具有客户端呈现。这可能会为您带来最佳的客户体验,但是构建两个不同模板(服务器端模板以及客户端模板)的成本很低。根据您网站的工作方式和使用方式,可能需要也可能不需要。例如,GMail是一个单页应用程序,但它是一个应用程序,你可以忍受它花费几秒钟显示加载条,而运行零售网站,这种滞后可能是不可接受的。
本地请求是否会减慢加载速度?您的意思是让您的网站进行REST调用以获取数据,而不是直接进入数据库吗?在这种情况下,它会增加一些延迟,因为涉及额外的网络跳,但在完善的系统和部署中,我认为滞后可能是可控的。
HTTP碱性。我只考虑通过HTTPS。它通过HTTP不够安全。这将在我链接到下面的演示文稿中介绍。
依赖数据。我也想知道这件事。我非常有帮助的是观看presentation from StormPath,它涵盖了实现RESTful API时的许多问题和良好实践。它们涵盖了一种链接数据的方法(遵循HATEOAS原则)以及实体扩展,因此GET到/customers/ID123?expand=address
将返回客户的表示,但嵌入了地址,这是一种避免多轮的好方法 - 获取所需的所有数据。
关于CF10的REST支持。我看着它,并不是那么热衷于它是如何工作的。我可能误解了它,但REST应用程序似乎与您试图混合的任何类型的常规应用程序非常分离。 Railo的实现看起来非常相似,但略有不同。当然,构建一个兼顾两者的REST应用程序似乎相当棘手。你看过Taffy了吗?我没有,但会对它的运作方式感兴趣。
因为REST是一种架构风格,而不是严格的标准,所以对于你如何实现事物有很大的自由度,并且有很多关于“最佳”方法的辩论/争论的范围
答案 1 :(得分:1)
我最近遇到了一个名为Taffy的项目,它是一个在ColdFusion中编写REST API的框架。它适用于CF8-10和Railo。我对它如何构造代码以及编写每个REST端点变得多么容易印象深刻。您可能希望查看该项目以及后端。
答案 2 :(得分:1)
在每个方面使用这种通用REST方法是否明智 单页? (在网站上开始使用REST是否明智?)
我不确定,但困扰我的一件大事是CF10中的REST调用如何绕过onError
错误处理程序。这是标有固定的bug report,但我们知道什么时候我们知道。 CF11?我不知道,请问Adobe。
这真的很糟糕,因为除了在客户端获取5xx错误代码之外,人们可能永远不会知道到底出了什么问题。
本地HTTP请求是否会影响性能并降低页面加载速度?
确实如此。我认为如果网络和网络都会更好。 RESTful API前端在服务层中调用相同的方法。
BasicAuth是否足以保护数据? (我只想补充一点 安全功能,例如请求垃圾邮件保护)
通常是,如果是HTTPS。取决于什么是“足够的”。
最好避免在Web服务中使用依赖项 / customer / access / address /接收数据?
同意barnyr,请阅读他的答案。
最后,只是想指出除了CF10的官方实现之外,还有像Taffy或ColdBox这样的框架可以处理没有CF10的RESTful API。
另外,请查看What can CF10 RESTful API do that Coldbox RESTful API cannot do? And vise versa?