如何将STRUCT - OR - JSON传递给Coldfusion CFC方法

gox*_*dia 6 ajax coldfusion jquery

我有一个现有的CFC,在将结构传递给方法时工作正常.

问题是,我们现在还需要通过JSON将数据传递到同一个函数中.

这是CFC片段:

<cffunction 
  name="subscribeAPI" 
  access="remote" 
  returntype="struct" 
  returnformat="json" 
  output="false">

  <cfargument 
    name="structure" 
    type="struct" 
    required="true" 
    hint="data structure received from call">

<cfif StructKeyExists(arguments.structure, "listID") 
  AND len(arguments.structure.listID)>
 ...
</cfif>

<cfreturn LOCAL />
Run Code Online (Sandbox Code Playgroud)

以下是我们传递结构的方式:

<cfset preStruct = {
  apiAction="Create",
  listID="1463",
  email="#form.cartEmail#",
  firstname="#form.first_name#",
  preCart="#now()#",
  planDescription="#application.name.site#"
  }
/>

<cfscript>voidReturn = application.goxObj.subscribeAPI(preStruct);</cfscript>
Run Code Online (Sandbox Code Playgroud)

现在,我们还需要传递以下内容,但由于CFC期望结构,显然会出现错误:

function HandleSubscribe(){
  $j.getJSON(
    "/com/list.cfc?wsdl",
    {
      method : "subscribeAPI",
      action : "Create",
      listID : $j( "#listID" ).val(),
      triggerKey : $j( "#triggerKey" ).val(),
      email : $j( "#emailNL" ).val(),
      firstname : $j( "#firstnameNL" ).val()
    },
  handleSubscribeCallback
);
Run Code Online (Sandbox Code Playgroud)

}

我们如何成功传入getJSON片段?

谢谢.

Ste*_*tti 3

JSON 只是一个字符串,因此您需要在方法调用到达实际服务层之前对其进行“处理”。

Danimal 是对的,您需要做的是围绕您的服务创建一个 Web 服务层包装器。

所以你的服务方法如下所示:

<cffunction name="CreateSubscription" access="public" returntype="struct" output="false">
    <cfargument name="listID" required="true" type="numeric">
    <cfargument name="emailaddress" required="true" type="string">
    <cfargument name="firstname" required="true" type="string">

    <cfset var resultset = {success=false}>

    <!--- Validate your listid and subscription details --->
    <!--- If Valid Then insert subscription --->
    <cfset resultset.success = true>

    <!--- else --->
    <cfset resultset.message = 'kerboom!'>

    <!--- only return what you need as a struct, not the whole local scope! --->
    <cfreturn resultset />
 </cffunction>
Run Code Online (Sandbox Code Playgroud)

您的订阅 API 如下所示:

<cffunction name="subscribeAPI" access="remote" returntype="struct" returnformat="json" output="false">

   <cfargument name="JSONPacket" type="string" required="true" hint="data structure received from call">
   <cfset var incomingData = deserializeJSON(arguments.JSONPacket)>
   <cfset var resultset = {success=false,message='invalid data'}>

   <cfif StructKeyExists(incomingData, "apiAction")>
       <cfif incomingData.apiAction EQ "create">
           <!--- You should also check you have the required fields for the createSubscription method here too. --->
           <cfset resultset = subscriptionService.createSubscription(incomingData)>
       </cfif>
   <cfelse>
       <cfset resultset.message = 'No API Action specified'>
   </cfif> 

   <cfreturn resultset>
</cffunction>
Run Code Online (Sandbox Code Playgroud)

因此,您将 JSON 推送到订阅 API,该 API 将数据转换为结构,并确保您拥有所有可用的正确数据并将其传递到您的订阅服务。订阅服务中的 createSubscription 方法检查 listid 是否存在,并检查该人是否已订阅。如果列表正常并且订阅不存在,则将新订阅插入数据库,否则将指示结构中出现问题的结果返回到 API 层,API 层将其转换为 JSON 并返回它。

这样做的好处是您可以在应用程序中重复使用服务,而无需通过 API 层,并且您的 API 层会处理将请求推送到正确的服务方法并确保有适当的数据可供它们使用。

不要传递本地范围!其中可能有大量的内容,包括服务中的所有其他方法。只需返回所需的内容即可。

还有其他可能更简洁的方法可以解决此问题 - 例如,您实际上可以将参数从 JSON 放入 CFC 上的方法调用中。您可以使用 cfajaxproxy 在服务和 javascript 之间创建层,使您能够直接将 cfc 方法作为 javascript 函数调用。我确信除此之外还有其他解决方案。

请记住... ColdFusion == 服务器端,Javascript == 客户端。将它们分开。在它们之间放置一层来处理通信。

希望有帮助。