我正在尝试在Coldfusion 10中设置REST服务,但我遇到了一些重大问题。我已经尝试了几种不同的安装配置,包括Windows 7和Vista,CF9和10共存和独立,IIS 7 / 7.5,Apache和Apache Tomcat。但是目前我只使用Vista,IIS7,CF10并使用默认网站。我一直得到基本相同的结果。
REST服务在CF Admin中正确注册 - C:\ inetpub \ wwwroot \ resttest \ 它识别出CFC已启用REST。
这是我的简单资源:
<cfcomponent rest="true" restPath="hello">
<cffunction name="sayHello" access="remote" returnType="String" httpMethod="GET">
<cfset res="Hello World">
<cfreturn res>
</cffunction>
</cfcomponent>
和我的电话:
<cfhttp url="http://127.0.0.1/rest/hello/" method="GET" result="res">
当我转出响应或转到该URI时,我得到500内部服务器错误:
请求的URL 127.0.0.1:80/jakarta/isapi_redirect.dll
物理路径C:\ ColdFusion10 \ config \ wsconfig \ 1 \ isapi_redirect.dll
我已经对我的cf配置和IIS进行了双重和三重检查,以获得正确的ISAPI过滤器。一切似乎都井然有序。不知道该怎么办,不知所措。
答案 0 :(得分:1)
尝试将此功能放入您的功能
restPath="/"
答案 1 :(得分:1)
这是一个非常有趣的解决方案......
我一直在使用全新的HelloWorld.cfc休息服务遇到同样的问题。当我将Application.cfc添加到REST目录时,500服务器错误立即消失,一切都按预期运行。
这是我的文件结构:
<root_folder>/
|-- Application.cfc
|-- model/
|-- HelloWorld.cfc
|-- test.cfm
在根Application.cfc中,在onRequestStart函数中,我有以下行:
<cfset restInitApplication( "#GetDirectoryFromPath(GetCurrentTemplatePath())#model/" , "MyRestService") />
文件test.cfm然后包含一个简单的cfhttp请求,转储结果:
<cfhttp url="localhost/rest/MyRestService/hello" result="response" method="get"></cfhttp>
<cfdump var="#response#">
HelloWorld.cfc只包含一个返回字符串的函数:
<cfcomponent rest="yes" restpath="hello">
<cffunction name="sayHi" access="remote" httpmethod="get" restpath="" returntype="string">
<cfreturn "Hi World!" />
</cffunction>
</cfcomponent>
通过初始设置,我在访问时遇到了一个500错误,“对象不是声明类的实例”:“localhost / test.cfm”。许多配置和测试都没有结果。在CF管理员中声明;重启CF;仅在代码中声明;仅在管理员中声明;直接浏览; cfhttp连接。没有任何效果。
然后我使用REST CFC将Application.cfc文件添加到模型目录中。 CFC中没有函数,只是最简单的Application.cfc文件,因此REST服务不会尝试从父文件夹中激活Application.cfc。
这种执行上下文的分离使一切变得不同。 500错误立即消失,REST响应按预期行事。因此,请确保您的REST文件夹具有自己的Application.cfc文件。它可以与父Application.cfc文件具有相同的应用程序名称,但它不需要从父目录调用Application.cfc。
希望这有助于其他人!
答案 2 :(得分:0)
我也遇到过CF 10 REST的问题。尝试重新启动CF服务。每次我对REST CFC进行更改时都必须重新启动。
答案 3 :(得分:0)
您的restPath
:
<cfcomponent rest="true" restPath="/hello">
查看这篇文章,因为他有一些很棒的代码示例,可以更详细地介绍这些:
http://www.adobe.com/devnet/coldfusion/articles/restful-web-services.html
答案 4 :(得分:0)
我有一个工作的REST组件,我发现的主要问题是我升级了一个旧组件,删除了所有其他功能 - 只有一个功能应该有httpmethod =“get”,否则CF不知道要调用哪一个(其他人应该发布POST?)
此外,我在函数中有一个restpath attr,在cfscript:
中 remote struct function readRole(required numeric site_role_id restargsource="path") httpmethod="get" returnformat="json" restpath="{site_role_id}" {
注释掉所有其他功能,然后测试一下:
<cfhttp url="http://127.0.0.1/rest/hello/1" method="GET" result="res">
另外为了简化操作,请在App.cfc requestOnStart中尝试添加此项,如果您认为它有帮助(您也可以使用密码或加密密钥保护它):
if (SERVER.ColdFusion.ProductVersion GTE 10 AND structKeyExists(url, "refreshRESTful"))
{
restInitApplication(getDirectoryFromPath(getCurrentTemplatePath()), this.name);
}
答案 5 :(得分:0)
经过无数个小时的努力,当我从我的REST服务配置(我在CF管理员中设置的那个)更改“服务器映射”时,问题就解决了:
/ API
到
API
删除前面的'/'后,500错误就消失了。现在我可以按如下方式调用我的API:
本地主机/休息/ API /作业/ 1
答案 6 :(得分:0)
我认为这可能是我的机器,所以我把它推到了我的共享托管环境,同样的问题也在发生。一旦我把application.cfc放在那里,我还没有收到500错误,性能也从每个请求的1.2秒增加到每个请求大约100-200ms,没有错误。
此外,如果您删除服务器上的休息服务文件夹,您的Rest服务将失败,您必须将文件夹放回以删除它。整个应用程序将废弃。在应用程序再次运行之前,它不会让我删除该特定服务而不将其放回(只是文件夹本身,其中没有任何内容)。只是一个FYI