Web services Coldfusion到Coldfusion web服务调用:SOAP vs cfhttp方法调用vs cfhttp post?
然后如何处理ws-producer端抛出的ws-consumer端异常 我现在使用SOAP是因为我可以轻松地使用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会弄乱数据字段,如电话号码
,而不用担心JSON会弄乱我的数据类型。然而,它的缺点是:
- WSDL必须具有返回类型(即,无法轻松返回自定义异常结构)
- WSDL在开发过程中需要重新加载
- 异常不会很好地传递,也不会很有帮助,并且
- 表演相当慢
至?方法=远程方法
至.cfm
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:
WSDL needs reloading during development
我不明白为什么“Note#2”解决了“开发过程中需要重新加载WSDL”。如果生产者端的服务发生了更改,消费者端仍然需要重新加载WSDL。抱歉,让我澄清一下:当CF执行Web服务时,它的存根会被缓存,这使得在不重新启动CF的情况下对服务应用更改很不方便——但是通过使用Ben博客文章中的技术,您可以在不重新启动CF的情况下清除存根缓存(完全重新加载)。因为CF8中有
refreshwsdl
,
我最终使用了cfhttp,并在JSON中返回了异常。