热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在ActionScript3中将”Null”(真正的姓氏!)传递给SOAPWeb服务?

我们有一名姓氏为Null的员工.当该姓氏用作搜索词时,我们的员工查找应用程序将被终止(现在经常发生这种情况).收到的错误(感谢Fiddler!)是:<soapen

我们有一名姓氏为Null的员工.当该姓氏用作搜索词时,我们的员工查找应用程序将被终止(现在经常发生这种情况).收到的错误(感谢Fiddler!)是:


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

可爱,对吧?

参数类型是string.

我在用:


  • WSDL(SOAP)

  • Flex 3.5

  • ActionScript 3

  • ColdFusion 8

请注意,从ColdFusion页面调用Web服务作为对象时,不会发生错误.

回答




追踪它

起初我以为这是一个强制性的错误,在那里null被强迫"null"并且"null" == null正在经历的考验.不是.我很亲密,但非常非常错.对于那个很抱歉!

我已经在wonderfl.net上进行了大量的调整,并在代码中进行了跟踪mx.rpc.xml.*.在XMLEncoder(在3.5源中)的第1795行setValue,所有的XMLEncoding归结为

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

这基本上与:

currentChild.appendChild("null");

根据我原来的小提琴,这段代码返回一个空的XML元素.但为什么?

原因

根据评论者Justin Mclean关于错误报告FLEX-33664的说法,以下是罪魁祸首(请参阅我的小提琴中的最后两个测试来验证这一点):

var thisIsNotNull:XML = null;
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",它首先将其转换为带有文本的根XML元素null,然后针对空文字测试该元素.这是一个弱的相等性测试,因此要么将包含null的XML强制转换为null类型,要么将null类型强制转换为包含字符串"null"的根xml元素,并且测试通过它可能失败的地方.一个修复可能是在检查XML(或任何真正的)"nullness"时始终使用严格的相等性测试.

我能想到的唯一合理的解决方法,就是在每个该死的ActionScript版本中修复这个bug,就是测试"null"字段并将它们作为CDATA值转义.

CDATA值是改变整个文本值的最合适方式,否则会导致编码/解码问题.例如,十六进制编码适用于单个字符.当您转义元素的整个文本时,首选CDATA值.最大的原因是它保持了人类的可读性.






在xkcd上,Bobby Tables网站提供了很好的建议,可以避免在各种语言(包括ColdFusion)的SQL查询中不正确地解释用户数据(在本例中为字符串"Null").

从问题中不清楚这是问题的根源,并且考虑到对第一个答案的评论中指出的解决方案(将参数嵌入到结构中),似乎它可能是其他东西.






问题可能出在Flex的SOAP编码器中.尝试在Flex应用程序中扩展SOAP编码器并调试程序以查看如何处理null值.我的猜测是,它以NaN(非数字)传递.这有时会弄乱SOAP消息解组过程(最值得注意的是在JBoss 5服务器......).我记得扩展了SOAP编码器并对NaN的处理方式进行了明确的检查.

(另一方面,如果员工ID为Null,您是否希望做一些有用的事情,这不是验证问题吗?我可能错了,因为我几乎不知道要求......)



  • name ="Null"当然很有用,我也不知道它应该如何与NaN相关.







@ doc_180有正确的概念,除了他专注于数字,而原始海报有字符串的问题.

解决方案是更改mx.rpc.xml.XMLEncoder文件.这是第121行

if (content != null)
result += content;

[我查看了Flex 4.5.1 SDK; 行号可能在其他版本中有所不同]

基本上,验证失败是因为'content为null',因此您的参数不会添加到传出的SOAP数据包中; 从而导致缺少参数错误.

您必须扩展此类以删除验证.然后链上有一个大雪球,修改SOAPEncoder以使用修改后的XMLEncoder,然后修改Operation以使用修改后的SOAPEncoder,然后对WebService进行moidfying以使用备用Operation类.

我花了几个小时,但需要继续前进.这可能需要一两天时间.

您可以修复XMLEncoder行并进行一些猴子修补以使用您自己的类.

我还要补充一点,如果你切换到使用带有ColdFusion的RemoteObject/AMF,则传递null并没有问题.


11/16/2013更新:

我最近添加了一篇关于RemoteObject/AMF的评论.如果您使用的是CF10; 然后从服务器端对象中删除对象上具有空值的属性.因此,您必须在访问之前检查属性是否存在,否则您将收到运行时错误.像这样检查:






这是CF9的行为变化; 其中null属性将变为空字符串.


编辑12/6/2013

由于存在关于如何处理空值的问题,因此这是一个快速示例应用程序,用于演示字符串"null"如何与保留字null相关联.


xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" min min initialize="application1_initializeHandler(event)">

import mx.events.FlexEvent;
protected function application1_initializeHandler(event:FlexEvent):void
{
var s :String = "null";
if(s != null){
trace('null string is not equal to null reserved word using the != condition');
} else {
trace('null string is equal to null reserved word using the != condition');
}
if(s == null){
trace('null string is equal to null reserved word using the == condition');
} else {
trace('null string is not equal to null reserved word using the == condition');
}
if(s === null){
trace('null string is equal to null reserved word using the === condition');
} else {
trace('null string is not equal to null reserved word using the === condition');
}
}
]]>





跟踪输出是:

使用==条件,null string不等于null保留字

使用===条件,null string不等于null保留字




  • @ Reboog711员工的姓氏实际上是字符串"Null",如"我的名字是Pat Null"你的答案未能通过员工的姓氏.你回答的只是隐藏了这样一个事实:"Null"被Ben Burns所描述的appendChild()方法强制转换为null的语言概念.结果仍然是系统未能与Null先生或Null女士打交道.


  • 别担心.如果你想看到真正的问题,请添加`var xml:XML = null ; var s:String =(xml == null)?"wtf?xml强制为null?!!" :"xml没有强制为null."; trace(s);`到您的代码示例.


  • @MaxxDaymon我认为您误解了我的答案实际上是什么。它没有提出解决方案。而是解释问题发生的原因;并引用Flex框架中的相关代码。我最近的编辑可能放错了位置;因为它讨论了另一种方法,并且与原始问题没有直接关系。







将所有字符转换为其十六进制实体等效项.在这种情况下,Null将被转换为&#4E;&#075;&#6C;&#6C;



  • 请不要这样做.创建CDATA是为了在需要转义整个文本块的情况下使用.


  • 我贬低了因为这是一种反模式.这种情况下的错误不在CF中,而是在ActionScript中.但是,你提出了一个好的观点.我将为我的小提琴添加一个CDATA编码测试.


  • 我可能是错的,但我不认为只是因为它不是*你的*解决方案是它应该如何工作.此外,您必须记住问题需要一个启发式解决方案,因为没有一种明显的方法,正如所发布的各种解决方案所证明的那样.最后,请记住我不知道CF,解码器不会将 的内部文本等同于 NULL的内部文本?如果是这样,那么CDATA真的是一个解决方案吗?







null在ActionScript中对值进行字符串化将为字符串提供字符串"NULL".我怀疑是有人决定,因此,一个好主意,将字符串解码"NULL"null,导致你在这里看到的破损-可能是因为他们在传递null对象和获取字符串在数据库中,当他们不想(所以一定要检查那种bug).






作为一个hack,你可以考虑在客户端进行特殊处理,将'Null'字符串转换为永远不会发生的字符串,例如,XXNULLXX并在服务器上转换回来.

它不漂亮,但它可以解决这种边界情况的问题.



  • XXNULLXX也可能是一个名字.你不知道.也许印度尼西亚的人没有姓氏,并在需要时使用XXX的姓氏作为姓氏.


  • @BenBurns是的,但如果我想给孩子起名字&#078;&#117;&#108;&#108;`怎么办?


  • 相同的概念,但更新数据库中的所有名称,然后更新一些字符(1Null,1Smith).在客户端中删除该角色.当然,这可能比Reboog的解决方案更有效.







好吧,我猜Flex的SOAP Encoder实现似乎错误地序列化了空值.将它们序列化为String Null似乎不是一个好的解决方案.正式版本似乎是传递null值为:


因此,"Null"的值只不过是一个有效的字符串,这正是您正在寻找的.

我想在Apache Flex中修复这个问题不应该那么难.我建议打开一个Jira问题或联系apache-flex邮件列表的人.然而,这只会修复客户端.我不能说ColdFusion是否能够使用这种方式编码的空值.

另请参阅Radu Cotescu的博客文章如何在soapUI请求中发送空值.



  • 这里有很好的信息,所以我不会投票,但我认为这值得评论.默认情况下,XMLEncoder.as实际上会通过在元素上设置`xsi:nil ="true"`来正确编码一个真正的`null`值.问题实际上似乎是ActionScript`XML`类型本身(不是编码器)处理字符串"null"的方式.







它是一个kludge,但假设有一个最小长度SEARCHSTRING,例如2个字符,第二个字符substringSEARCHSTRING参数,并将其作为两个参数传递:SEARCHSTRING1 ("Nu")并且SEARCHSTRING2 ("ll"). Concatenate在执行查询到数据库时它们一起返回.



  • CDATA被添加到XML规范中以避免这些类型的kludges.


  • @jasonkarns - 我同意100%认为_should_对于字符串/文本节点`NULL`没什么特别的,但要迂腐,` null `和` `与XML解析器不同.它们_should_产生相同的结果,但处理它们的逻辑流程是不同的.我们正在利用这种效果来解决flex XML实现中的错误.我主张其他方法,因为它保留了文本的可读性,并且对其他解析器没有副作用.


  • 没有必要使用CDATA转义"Null",XML中没有null关键字.


  • 同意@eckes.我不明白为什么会有关于CDATA的所有这些话题.CDATA仅用于转义在XML中具有特殊含义的字符.没有:`n`,`u`,`l`在XML中有特殊的语义."NULL"和""与XML解析器相同.







推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 摘要1:ElasticSearch比较两个时间的大小_gaojie_csdn的博客-CSDN博客_es时间比较摘要2:zlasticsearch脚本教 ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 1.一般应用(访问名称空间下方法)usenamespacemx_internal;vartextArea:TextAreaTextArea();textArae.htmlText ... [详细]
  • Postman 调试 WebService
    Postman调试WebServiceWebServicePostman设置Headers请求头参数Body请求体传参返回结果WebService天气预报Web服务http:ww ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Excel数据处理中的七个查询匹配函数详解
    本文介绍了Excel数据处理中的七个查询匹配函数,以vlookup函数为例进行了详细讲解。通过示例和语法解释,说明了vlookup函数的用法和参数的含义,帮助读者更好地理解和运用查询匹配函数进行数据处理。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
author-avatar
45仰望易_332
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有