Web services Coldfusion到Coldfusion web服务调用:SOAP vs cfhttp方法调用vs cfhttp post?

Web services Coldfusion到Coldfusion web服务调用:SOAP vs cfhttp方法调用vs cfhttp post?,web-services,coldfusion,Web Services,Coldfusion,然后如何处理ws-producer端抛出的ws-consumer端异常 我现在使用SOAP是因为我可以轻松地使用,而不用担心JSON会弄乱我的数据类型。然而,它的缺点是: WSDL必须具有返回类型(即,无法轻松返回自定义异常结构) WSDL在开发过程中需要重新加载 异常不会很好地传递,也不会很有帮助,并且 表演相当慢 除了SOAP,您将使用什么来执行CF到CF方法调用?我可以想到以下几种选择: 至?方法=远程方法 缺点:需要使用自定义json序列化程序,因为CF会弄乱数据字段,如电话号码

然后如何处理ws-producer端抛出的ws-consumer端异常

我现在使用SOAP是因为我可以轻松地使用
,而不用担心JSON会弄乱我的数据类型。然而,它的缺点是:

  • WSDL必须具有返回类型(即,无法轻松返回自定义异常结构)
  • WSDL在开发过程中需要重新加载
  • 异常不会很好地传递,也不会很有帮助,并且
  • 表演相当慢
除了SOAP,您将使用什么来执行CF到CF方法调用?我可以想到以下几种选择:

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

  • .cfm
缺点:需要确保未呈现onRequest和其他布局(无法使用
onCFCRequest()


有什么评论或建议吗?

最近我更喜欢cfhttp而不是提供JSON结果的URL,而不是基于CFC/WSDL的Web服务。我发现这更容易,原因有两个:

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

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

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


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

这是一个边缘意见问题,因此我将用可能的解决方案解决您提出的每一项问题

然后,如何在ws-consumer端处理 ws制作人方面

解决方案:决定一个公共通信“包”(例如,带有特定键的结构),无论是否引发异常,都将始终返回该包。例如:

result = StructNew();
result.error = false
result.msg = "Success";
result.data = myQuery
现在总是可以返回结果,客户机可以引用“error”、“msg”和“data”键

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

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

  • 设置属性returnFormat=“plain”
  • 设置属性returntype=“XML”
  • 在方法体中重新处理数据,以便返回的对象是XML
  • 使用新的JSON序列化程序/反序列化程序:
  • 缺点:需要确保未呈现onRequest和其他布局(无法使用onCFCRequest())

    解决方案:

  • 将您的服务cfc移动到其自己的子目录,该子目录本身包含其自己的webservice驱动应用程序。cfc
  • 构造上述Application.cfc以隐藏/销毁onRequest()事件(来源:)
  • 注:#2也解决了您的上述问题,报价:

    WSDL needs reloading during development
    

    我不明白为什么“Note#2”解决了“开发过程中需要重新加载WSDL”。如果生产者端的服务发生了更改,消费者端仍然需要重新加载WSDL。抱歉,让我澄清一下:当CF执行Web服务时,它的存根会被缓存,这使得在不重新启动CF的情况下对服务应用更改很不方便——但是通过使用Ben博客文章中的技术,您可以在不重新启动CF的情况下清除存根缓存(完全重新加载)。因为CF8中有
    refreshwsdl
    我最终使用了cfhttp,并在JSON中返回了异常。