Coldfusion 8和HTTP PUT - 有没有办法输出一个物体?

时间:2010-03-25 17:09:09

标签: java http coldfusion serialization ehcache

我们正在使用带有CF 8的EHCache,使用HTTP上的RESTful接口在中央服务器上缓存内容。我正在尝试将cfquery 对象缓存到缓存服务器。

如果我直接调用EHCache(即将其存储在本地缓存中),我可以使用它,但如果我尝试通过HTTP缓存远程服务器,我遇到了问题。

我使用的代码如下:

<cfhttp url="http://localhost:8080/myCache/myKey"
  method="put" 
  result="r" 
  timeout="2" 
  throwonerror="true" >
    <cfhttpparam type="body" value="#ARGUMENTS.item#" />
</cfhttp>

CF不喜欢这个#ARGUMENTS.item#的引用,它抱怨Complex object types cannot be converted to simple values.

有人能举例说明如何使用CF将对象放在http上吗?如果CF无法实现这一点,那么Java示例将是下一个最好的事情。

非常感谢提前!

PS:我不想将序列化用于text / JSON等,因为这种方法存在数据完整性问题,最重要的是它不够快。

2 个答案:

答案 0 :(得分:3)

是的,您必须序列化参数结构,因为没有某种形式的序列化,无法通过HTTP传递二进制对象。如前所述,您可以使用JSON来序列化对象。可以使用的JSON的替代方案是cfwddx标记,它可以将对象转换为XML。但JSON可能更好,因为它不像cfwddx生成的XML那么冗长。

答案 1 :(得分:2)

我发现如果我在将ARGUMENTS.item变量传递给函数之前执行以下操作,我可以使用上面的确切代码:

<cfquery name="qData" datasource="#VARIABLES.dsn#">
select * from myData
</cfquery>

<!--- Setup and init Java objects --->
<cfset byteArrayOutputStream = createObject("java","java.io.ByteArrayOutputStream") />
<cfset objectOutputStream = createObject("java","java.io.ObjectOutputStream") />
<cfset byteArrayOutputStream.init() />
<cfset objectOutputStream.init(byteArrayOutputStream) />

<!--- Serialize the cfquery object --->
<cfset objectOutputStream.writeObject(qData) />
<cfset serializedQuery = toBase64(byteArrayOutputStream.toByteArray()) />
<cfset objectOutputStream.close() />    

<!--- Stick in the cache --->
<cfset myCache.put(myCacheName, key, serializedQuery) />

宾果!之后使用serializedQuery,它可以通过HTTP通过线路进行PUT。当您从EHCache取回时,您需要执行以下操作:

<!--- Get result value from cache --->
<cfset cacheData = myCache.get(myCacheName, key) />

<!--- Java objects setup --->
<cfset byteArrayInputStream  = createObject("java","java.io.ByteArrayInputStream") />
<cfset objectInputStream = createObject("java","java.io.ObjectInputStream") />

<!--- deserialize --->
<cfset ba = toBinary(cacheData) />
<cfset byteArrayInputStream.init(ba) />
<cfset objectInputStream.init(byteArrayInputStream) />
<cfset deserializedQuery = objectInputStream.readObject() />
<cfset objectInputStream.close() />

<!--- Dump query --->
<cfdump var="#deserializedQuery#" />

这种类型的序列化也非常非常快。我可以理解其他人使用JSON表示,但我不确定它们是否同样快。

无论如何,这对我来说似乎很有用。谢谢大家的意见。我希望其他人觉得这很有用。