SOAP UI测试WebService时XML请求解析失败求助
WebService SOAP请求解析失败问题排查
问题背景
使用SOAP UI工具进行WebService测试,依据WSDL编写脚本后,请求未被正常处理,服务器返回XML解析错误。
预期响应结果
<134>1 2024-02-22T12:42:35+01:00 - java - - - com.sagemcom.dc.spain.ws.server.requests.Orders order [order] idPet 53, format 0, priority 3, fini 20240222124347000W, ffin 20240222124647000W <Order xmlns="http://stgdc/ws/B07" IdReq="B07" IdPet="53" Version="4.0"> <Cnc Id="SAG6300004F92"> <B07> <GENERAL CheckSTG="N" /> <MULTI_STG> <STG STGid="STG1" PortSTG="8080" ipStg="172.25.0.55" StgProtocol="http" StgPath="/WS_STG/WS_STG.asmx" nRetryWS="3" tRetryWS="30" toutWS="10" FtpProtocol="FTP" DestDirReport="/cycles" ipFtp="172.25.0.55" nRetryFtp="5" tRetryFtp="300" toutFtp="300" FtpRandomDelay="100" FtpUserReport="hola" FtpPwdReport="hola" ipFtpDCUpg="172.25.0.55" UserFtpDCUpg="DCUPGRADE" PwdFtpDCUpg="" ipFtpMeterUpg="172.25.0.55" UserFtpMeterUpg="CNTUPGRADE" PwdFtpMeterUpg="" /> <STG STGid="STG2" PortSTG="8030" ipStg="192.168.1.35" StgProtocol="http" StgPath="/WS_STG/WS_STG.asmx" nRetryWS="1" tRetryWS="30" toutWS="10" FtpProtocol="FTP" DestDirReport="/downloads" ipFtp="192.168.1.35" nRetryFtp="0" tRetryFtp="1" toutFtp="1" FtpRandomDelay="0" FtpUserReport="hola" FtpPwdReport="hola" ipFtpDCUpg="192.168.1.35" UserFtpDCUpg="DCUPGRADE" PwdFtpDCUpg="" ipFtpMeterUpg="192.168.1.35" UserFtpMeterUpg="CNTUPGRADE" PwdFtpMeterUpg="" /> </MULTI_STG> <EVENTS SpontSTGDest="4" /> </B07> </Cnc> </Order>
构造的SOAP请求
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="urn:stgdc/dc/ws"> <soapenv:Header/> <soapenv:Body> <ws:Order> <ws:IdPet>111</ws:IdPet> <ws:Format>0</ws:Format> <ws:Order>xmlns="http://stgdc/ws/B07" IdReq="B07" Version="4.0"<Cnc Id="SAG6300004F92"<B07><GENERAL CheckSTG="N" /><MULTI_STG><STG STGid="STG1" PortSTG="8080" ipStg="172.25.0.55" StgProtocol="http" StgPath="/WS_STG/WS_STG.asmx" nRetryWS="3" tRetryWS="30" toutWS="10" FtpProtocol="FTP" DestDirReport="/cycles" ipFtp="172.25.0.55" nRetryFtp="5" tRetryFtp="300" toutFtp="300" FtpRandomDelay="100" FtpUserReport="hola" FtpPwdReport="hola" ipFtpDCUpg="172.25.0.55" UserFtpDCUpg="DCUPGRADE" PwdFtpDCUpg="" ipFtpMeterUpg="172.25.0.55" UserFtpMeterUpg="CNTUPGRADE" PwdFtpMeterUpg="" /></MULTI_STG><EVENTS SpontSTGDest="4" /></B07></Cnc>></ws:Order> <ws:Fini>20240226154024000W</ws:Fini> <ws:Ffin>20240226154824000W</ws:Ffin> <ws:Priority>1</ws:Priority> </ws:Order> </soapenv:Body> </soapenv:Envelope>
实际返回结果
<134>1 2024-02-26T17:35:49+01:00 - java - - - com.sagemcom.dc.spain.ws.server.requests.Orders order [order] idPet 111, format 0, priority 1, fini 20240226154024000W, ffin 20240226154824000W xmlns="http://stgdc/ws/B07" IdReq="B07" Version="4.0"<Cnc Id="SAG6300004F92"<B07><GENERAL CheckSTG="N" /><MULTI_STG><STG STGid="STG1" PortSTG="8080" ipStg="172.25.0.55" StgProtocol="http" StgPath="/WS_STG/WS_STG.asmx" nRetryWS="3" tRetryWS="30" toutWS="10" FtpProtocol="FTP" DestDirReport="/cycles" ipFtp="172.25.0.55" nRetryFtp="5" tRetryFtp="300" toutFtp="300" FtpRandomDelay="100" FtpUserReport="hola" FtpPwdReport="hola" ipFtpDCUpg="172.25.0.55" UserFtpDCUpg="DCUPGRADE" PwdFtpDCUpg="" ipFtpMeterUpg="172.25.0.55" UserFtpMeterUpg="CNTUPGRADE" PwdFtpMeterUpg="" /></MULTI_STG><EVENTS SpontSTGDest="4" /></B07></Cnc>> <135>1 2024-02-26T17:35:49+01:00 - java - - - sun.net.httpserver.ServerImpl logReply POST /WS_DC/WS_DC.asmx HTTP/1.1 [200 OK] () <13>1 2024-02-26T17:35:49+01:00 - pik - - - [Fatal Error] :1:1: Content is not allowed in prolog. <131>1 2024-02-26T17:35:49+01:00 - java - - - com.sagemcom.dc.spain.ws.server.requests.OrdersParsingThread run com.sagemcom.scheduler.spain.orders.InvalidOrderException: Invalid xml org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog. (5) at com.sagemcom.dc.spain.ws.server.requests.OrdersParsingThread.createOrderTask(OrdersParsingThread.java:145) at com.sagemcom.dc.spain.ws.server.requests.OrdersParsingThread.run(OrdersParsingThread.java:116)
问题原因及修复建议
核心原因
- XML结构完全破坏:请求中
<ws:Order>内部的内容处理错误,既错误转义了XML标签(使用<),又存在标签未闭合的问题(比如<Cnc Id="SAG6300004F92"缺少闭合>),导致服务器解析时无法识别合法XML结构,把开头的xmlns="..."当成XML声明外的非法内容,触发"prolog中不允许内容"的错误。 - 节点命名冲突与格式违规:外层已使用
<ws:Order>节点,内部又嵌套同名节点,且内部节点内容并非合法XML子节点,而是转义后的文本,完全不符合SOAP请求的XML规范。
修复建议
- 修正XML嵌入方式:如果需要将内部Order作为XML节点嵌入,无需转义
<和>,应正确设置命名空间,将其作为合法XML子节点插入,示例如下:<ws:Order> <ws:IdPet>111</ws:IdPet> <ws:Format>0</ws:Format> <Order xmlns="http://stgdc/ws/B07" IdReq="B07" Version="4.0"> <Cnc Id="SAG6300004F92"> <B07> <GENERAL CheckSTG="N" /> <!-- 其他子节点保持原样 --> </B07> </Cnc> </Order> <!-- 其他参数 --> </ws:Order> - 修复标签闭合错误:确保所有XML标签正确闭合,比如将
<Cnc Id="SAG6300004F92"改为<Cnc Id="SAG6300004F92">。 - 区分命名空间:通过命名空间明确区分外层
<ws:Order>和内部<Order>,避免解析混淆。
内容的提问来源于stack exchange,提问作者Nabil
相关产品推荐
相关产品推荐

