ColdFusion MVC框架& RESTful服务不匹配?

时间:2010-06-02 02:14:26

标签: model-view-controller rest coldfusion

大多数CF MVC框架使用前端控制器模式。通常,搜索引擎安全(SES)插件与URL Rewrite一起用于构建友好URL。但是,在实现RESTful服务时,使用MVC框架似乎是在另一层复杂性之上添加了一层复杂性。

如何驯服这头野兽?使用ColdFusion支持RESTful服务的任何好的和干净的方法?任何可以轻松公开RESTful服务的MVC框架?

由于

7 个答案:

答案 0 :(得分:3)

ColdBox长期以来一直支持RESTful URL。在3.0中,您甚至可以拆分传入的HTTP谓词,以一种漂亮的解耦方式执行不同的操作。在这里阅读:http://blog.coldbox.org/post.cfm/coldbox-rest-enabled-urls

您甚至可以非常轻松地在事件处理程序上使用HTTP方法安全性:

component{

    this.allowedMethods = {
        LIST = "GET",
        SAVE = "POST,PUT"
    };
}

答案 1 :(得分:2)

我一直在使用Powernap(http://powernap.riaforge.com)来实现RESTful Web服务。它不是MVC框架,但我认为它可以与您当前在应用程序中使用的任何框架一起工作。

答案 2 :(得分:2)

我之前尝试过使用PowerNap,但我觉得它与我正在做的事情不相符(在现有应用程序之上构建API)。我的解决方案是RESTfulCF:它是前端控制器,但没有实现完整的MVC,因为(正如你所说)那是过度杀伤。

我们目前正在使用RESTfulCF为White Label Dating的许多(大量使用)内部系统供电,并且它像梦一样运行,同时允许我们继续从API层构建其余的应用程序,我们用于揭示我们需要的系统。

答案 3 :(得分:1)

我按照Fowler的PageController模式使用MVC来实现REST服务。每个资源一个控制器,控制器为每个支持的http方法实现一个方法。即GET,PUT,POST,DELETE。

适合我。我的方法与MVC的标准解释不同的唯一区域是我的模型实际上是UI内容的模型。它不是域模型。它可能包含域模型中的元素,但也可能包含其他内容。

答案 4 :(得分:1)

有趣的你应该问。我是PowerNap的粉丝,但我认为可以用另一种方式做得更好,所以我上周开始了我自己的框架 。它仍然是一个前端控制器框架,因此所有内容都通过index.cfm(使用url-rewriting轻松删除)进行引导,但它专门用于编写RESTful Web服务。它从PowerNap和FW/1中吸取了很多灵感。

它仍然有点粗糙,但它有效。现在我称之为概念证明;但在我称之为1.0版本之前,它还有很长的路要走。我已将some informationthe source放在github上。

2010年8月23日更新:Now officially at 1.0! :)

答案 5 :(得分:0)

Quicksilver也不错! http://quicksilver.riaforge.org/

/**
* @url /hello/{text}
* @httpMethod GET
*/
public String function saySomething(required String text) {
return "Hello " & arguments.text;
}

实际网址:

index.cfm/hello/developer

答案 6 :(得分:0)

另一种选择是Taffy(https://github.com/atuttle/Taffy)。为每个URI模板添加一个CFC,并为要支持的每个HTTP方法定义一个方法(GET,PUT,DELETE等)。

<cfcomponent extends="taffy.core.resource" output="false"
             taffy_uri="/user/{userID}/stuff/{stuffID}/property/{propertyID}">

    <cffunction name="get" access="public" output="false">
            ...
    </cffunction>

    <cffunction name="post" access="public" output="false">
            ...
    </cffunction>

    <cffunction name="delete" access="public" output="false">
            ...
    </cffunction>
</cfcomponent>