Coldfusion-to-Coldfusion Web服务调用:SOAP vs cfhttp方法调用vs cfhttp post?

时间:2011-11-25 19:04:15

标签: web-services coldfusion

你如何处理ws生产者方抛出的消费者方面的异常?

我现在正在使用SOAP,因为我可以轻松使用<cfinvoke>而不用担心JSON会搞乱我的数据类型。但它的缺点是:

  • WSDL必须具有返回类型(即不能轻易返回自定义异常结构)
  • WSDL需要在开发期间重新加载
  • 异常不会很好地传播,也不会非常有用,
  • 表现很慢

除了SOAP之外,你会用什么来做CF-to-CF方法调用?我可以想到这些替代方案:

  • <cfhttp>?method=remoteMethod

缺点:需要使用自定义json序列化程序,因为CF会弄乱数据字段,如电话号码(序列化为浮点数)或日期(序列化为人类可读日期)

  • <cfhttp>.cfm

缺点:需要确保onRequest和其他布局不呈现(不能使用onCFCRequest()

有任何意见或建议吗?

2 个答案:

答案 0 :(得分:1)

最近我更喜欢cfhttp到一个URL,该URL提供基于CFC / WSDL的webservices的JSON结果。我发现这更容易,原因有两个:

1)当从CF或jQuery(或实际上任何其他消费者)消费时,这很有效。

2)你可以更好地控制输出,这听起来就像你正在经历的那样。

对于客户端的错误捕获,我认为服务器端错误捕获非常简单。只需注意404,并根据需要处理响应正文(通过电子邮件发送,记录或报告给用户)。关于JSON序列化问题,这还不是我遇到过的问题。

当我使用基于wsdl的webservices时,我们使用try / catch捕获错误,然后将错误转储通过电子邮件发送给开发人员。但这并不好,因为真正的错误通常隐藏在堆栈跟踪中,并且被所涉及的所有CF抽象层遮盖。基本上所有这些告诉我在这些情况下我需要去寻找服务器上的错误日志,所以我可以找到问题的真正来源。

答案 1 :(得分:1)

这是一个边缘意见问题,所以我会用可能的解决方案来解决您提出的每个问题。

  

然后如何处理由ws消费者端抛出的异常   ws生产者方?

解决方案:决定您将始终返回的公共通信“包”(例如,具有某些键的结构),无论是否抛出异常。例如:

result = StructNew();
result.error = false
result.msg = "Success";
result.data = myQuery

现在总是可以返回结果,客户可以引用键'错误','msg'和'data'的预期。

  

缺点:需要使用自定义json序列化程序,因为CF会搞乱   数据字段,如电话号码(序列化为浮点数)或日期   (序列化到人类可读的日期)

解决方案:从JSON切换到XML:

  1. 设置属性returnFormat =“plain”
  2. 设置属性returntype =“XML”
  3. 在方法体中重新处理数据,以便返回的对象为XML
  4. OR

    1. 使用新的JSON Serializer / Deserializer:JSONUtil Project
    2.   

      缺点:需要确保onRequest和其他布局不呈现(不能使用onCFCRequest())

      解决方案:

      1. 将您的服务CFC移动到他们自己的子目录中,该子目录本身包含自己的Web服务驱动Application.cfc
      2. 构造上述Application.cfc以隐藏/销毁onRequest()事件(来源:Ben Nadel
      3. 注意:#2也解决了上述问题,引用:

        WSDL needs reloading during development