2

使用 ColdFusion 10 的新 REST API 时,如何通过管道进入响应管道,以便在 ColdFusion 10 的 REST API 序列化 JSON 响应后更改它?

例如,假设我有以下端点:

<cfcomponent rest="true" restpath="/widgets" produces="application/json">

    <cffunction name="getWidget" access="remote" httpmethod="GET" restpath="{id}" returntype="struct">
        <cfargument name="id" required="true" restargsource="path" type="numeric"/>

        <cfreturn {
            id = arguments.id,
            code = "string:.10"
        } />
    </cffunction>

</cfcomponent>

在此方法返回后(即在 ColdFusion 使用 SerializeJSON 创建 JSON 响应后),我想将“string:”替换为空字符串。我尝试这样做(使用此处描述的技术:http: //house-of-fusion.10909.n7.nabble.com/getPageContext-in-onRequestEnd-is-empty-td78578.html)但我无法改变响应。任何人都知道我可以如何更改响应?

背景:

我正在寻找这样一个黑客的原因是因为 SerializeJSON (CF 10 REST API 使用的默认序列化)会将code = ".10"视为浮点数并呈现"code":0.1,这不是我想要的. 这个问题有据可查,但是在使用本机 REST API 时克服这个问题的解决方案似乎没有在任何地方记录。

4

2 回答 2

1

似乎没有办法利用 ColdFusion 的响应管道来编辑由 ColdFusion 10 的 REST API 生成的响应主体。但是,对于 IIS 用户,您可以为此使用 HttpModules。您需要在 .NET 中编写 HttpModule,但这非常简单。我写了几个 HttpModules 来对 ColdFusion 的响应进行后处理,源代码可在此处获得:

https://github.com/johnnyoshika/coldfusion-rest-post-process

如果您尝试解决我在此问题中确定的相同问题,则可以使用我在此处发布的 HttpModule:

https://github.com/johnnyoshika/coldfusion-rest-post-process/blob/master/JsonStringCleanserModule.cs

要将其插入您的应用程序,您可以按照以下步骤操作:

1)获取准备使用的DLL:

https://github.com/johnnyoshika/coldfusion-rest-post-process/tree/master/bin/Release

从该 URL获取ColdFusion.RestPostProcess.dll文件并将其放入 ColdFusion 应用程序的 bin 文件夹中

例如,如果您的 ColdFusion 应用程序在这里:

C:/myapp

然后你想把dll放在这里:

C:/myapp/bin/ColdFusion.RestPostProcess.dll

如果您不想信任陌生人的 DLL,则需要查看源代码并自己在 Visual Studio 中编译项目以生成 DLL。

2)修改web.config

在应用程序的根目录中修改或创建 web.config 文件。内容应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <httpModules>
            <!-- This is for IIS5, IIS6, and IIS7 Classic -->
            <add name="JsonStringCleanserModule" type="ColdFusion.RestPostProcess.JsonStringCleanserModule"/>
        </httpModules>
    </system.web>
    <system.webServer>
        <modules>
            <!-- This is for IIS7+ Integrated mode -->
            <add name="JsonStringCleanserModule" type="ColdFusion.RestPostProcess.JsonStringCleanserModule"/>
        </modules>
    </system.webServer>
</configuration>

**3) 在字符串前面加上***string***:

每当您想在 JSON 中输出字符串时,请在值前面加上***string***:. 例如:

<cffunction name="getWidget" access="remote" httpmethod="GET" restpath="{id}" returntype="struct">
    <cfargument name="id" required="true" restargsource="path" type="numeric"/>

    <cfreturn {
        id = arguments.id,
        code = "***string***:.10"
    } />
</cffunction>

那应该这样做。添加***string***:强制 ColdFusion 将值序列化为字符串,然后 HttpModule 将删除所有实例,***string***:因此最终输出将是:

{"id":1,"code":".10"}
于 2013-04-05T01:10:55.763 回答
0

您还可以使用此处描述的自定义响应

您自己将数据序列化为 json,更改字符串并将其设置为响应内容。简而言之,函数内部的代码如下所示:

<cfset response=structNew()>
<cfset response.status=201>
<cfset var content = SerializeJSON(data)>
<!--- change the content string --->
<cfset response.content= content>
<cfset response.headers=structNew()> 
<cfset restSetResponse( response )>

HTH。

于 2014-02-28T19:57:22.810 回答