如何在ActionScript 3中将"Null"(一个真实的姓氏!)传递给SOAP Web服务

发布时间 2023-10-13 19:41:59作者: 小满独家

内容来自 DOC[ https://q.houxu6.top/?s=如何在ActionScript 3中将"Null"(一个真实的姓氏!)传递给SOAP Web服务](https://q.houxu6.top/?s=如何在ActionScript 3中将"Null"(一个真实的姓氏!)传递给SOAP Web服务)

我们有一位员工的姓氏是“Null”。当使用该姓氏作为搜索条件时,我们的员工查找应用程序会被终止(现在这种情况经常发生)。收到的错误信息(感谢Fiddler!)如下:

<soapenv:Fault>
   <faultcode>soapenv:Server.userException</faultcode>
   <faultstring>coldfusion.xml.rpc.CFCInvocationException: [coldfusion.runtime.MissingArgumentException : The SEARCHSTRING parameter to the getFacultyNames function is required but was not passed in.]</faultstring>

很可爱,对吧?

参数类型是string

我正在使用:

  • WSDLSOAP)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

注意,错误不会在从ColdFusion页面调用webservice作为对象时发生。


追踪问题

一开始我以为这是一个强制转换错误,其中 null 被强制转换为 "null",并且 "null" == null 测试通过。但不是这样的。我非常接近了,但非常、非常错误。抱歉!

后来我在 wonderfl.net 上做了很多调试,并跟踪了 mx.rpc.xml.* 中的代码。在 XMLEncoder 的第1795行(在3.5源代码中),在 setValue 函数中,所有的 XMLEncoding 都归结为:

currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));

这本质上与:

currentChild.appendChild("null");

根据我的原始 fiddle,这段代码返回一个空的 XML 元素。但是为什么?

原因

根据评论者 Justin Mclean 在 bug 报告 FLEX-33664 中的指出,以下是问题所在(在我的 fiddle 中的最后两个测试验证了这一点):

var thisIsNotNull:XML = <root>null</root>;
if(thisIsNotNull == null){
    // always branches here, as (thisIsNotNull == null) strangely returns true
    // despite the fact that thisIsNotNull is a valid instance of type XML
}

currentChild.appendChild 传递字符串 "null" 时,它首先将其转换为带有文本 null 的根 XML 元素,然后对该元素进行空值测试。这是一个弱等式测试,因此要么包含 null 的 XML 被强制转换为 null 类型,要么 null 类型被强制转换为包含字符串 "null" 的根 xml 元素,测试通过了,尽管它可能应该失败。一个修复方案可能是在检查 XML(或任何内容)是否为“null”时始终使用严格的等式测试。

解决方案

除了修复此 ActionScript 版本中的每个 damn 版本的 bug 之外,我能想到的唯一合理的解决方法是测试字段是否为“null”,并将它们转义为 CDATA 值。CDATA 值是避免编码/解码问题的最合适的方式。 例如十六进制编码,它适用于单个字符。当您需要转义元素的整个文本时,CDATA 值是首选的。这样做的最大原因是它保持了可读性。