您的位置:首页 > 其它

Axis2c开发Webservice时,接口参数不支持中文字符

2016-04-20 16:36 225 查看
工作中需要使用Axis2c进行WebService的开发,实战中,遇到几个莫名其妙的问题,费尽周折地排查、调试,最后确认是因为不支持中文字符的问题。

总结如下:

1、输入参数不支持中文字符

如果输入参数中包含中文字符(如“账号123”或“123账号”或“账号”),如果该参数不是最后一个输入参数,则WebService在校验参数adb_InterfaceName_is_paramName_nil会异常(校验该参数后一个参数时,返回true),如果该参数是接口最后一个输入参数,则WebService获取参数adb_InterfaceName_get_paramName会异常(获取该参数的实参值与实际传入不一致—-实参为“账号123”或“123账号”或“账号”时得到的实参值均为“”)

2、输出参数不支持中文字符

如果输出参数的值为(如“flowId流水号”),则返回的是乱码(”flowId?????”);

发现和确认该问题的详细过程备案记录如下:

今天自测时遇到问题,调用某个接口时,时不时会出现“adb_InterfaceName_is_paramName_nil”(其中InterfaceName是接口名称,paramName是输入参数名称)参数校验失败(实际该参数传入有值的,不是空)

在核查各种可能出错的可能都没确认的情况下(甚至根据wsdl重新生成一遍),想起这种异常是时不时出现,不是总是出现,想到又可能是输入参数导致的

对测试用例进行核查,发现有部分用例中,输入参数为中文字符,而且这些参数含中文的用例报异常。(更加怀疑是中文参数导致的问题)

用其中的一个用例测试、调试发现,当调用参数含中文时,如:参数tradeType的值为“批发”,则axis2c在解析输入参数时,adb_InterfaceName_deserialize_obj方法在获取tradeType下一个参数信息时,axiom_node_get_next_sibling获取会失败,进而导致该参数的adb_InterfaceName_is_paramName_nil返回true。也就是说,如果tradeType为接口最后一个输入参数,则所有adb_InterfaceName_is_paramName_nil校验应该都能正常通过(但这并不表示没有问题)

修改用例将最后一个输入参数tradeUser的实参改成带中文字符值(如“老王”),继续调试发现,tradeUser参数虽然如预料通过adb_InterfaceName_is_tradeUser_nil校验(即该函数返回false),但是使用adb_InterfaceName_get_tradeUser获取的参数值不是调用时传入的“老王”,而是“”。也就是说,解析参数发生了改变现场的行为,当然,调用结果肯定也不是你期望的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: