我正在使用SoapUI Pro测试用于创建邮寄发货货件的网络服务。
我正在使用groovy脚本来验证我的Web服务请求。如果我希望请求成功,我会在'status'字段中查找'Allocated'值。如果我希望请求失败,我会在集成页脚中查找正确的错误代码和errorDescription。
有时,有效请求会发出警告消息(例如,通知用户字段数据太长且已被截断)。我也想验证这些警告信息。
我在数据源文件中指定要验证的元素路径,然后将其传递给执行验证的groovy脚本。
groovy脚本检索元素路径中的值,并使用..将其赋值给变量actualReturn1。
actualReturn1 = holder.getNodeValue(testElementOne);
其中testElementOne可以是
//NS1:completedShipmentInfo/NS1:status/status/statusCode/code
OR
//NS1:createShipmentResponse/NS1:integrationFooter/errors/error/errorCode
第一条路径有效,并且正确地将此状态字段的值分配给actualReturn1
。
但是第二条路径似乎没有效果,并且将null赋给actualReturn1。
下面是我的2个响应文件的一部分,我正在尝试从中提取数据。
成功提取的状态元素的响应..
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<NS1:createShipmentResponse xmlns:NS1="http://www.royalmailgroup.com/api/ship/V1">
<NS1:integrationHeader>
<dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2013-12-02T17:06:11</dateTime>
<version xmlns="http://www.royalmailgroup.com/integration/core/V1">1</version>
<identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
<applicationId>111111113</applicationId>
<transactionId>420642961</transactionId>
</identification>
</NS1:integrationHeader>
<NS1:completedShipmentInfo>
<NS1:status>
<status>
<statusCode>
<code>Allocated</code>
</statusCode>
</status>
无法解析的errorCode响应...
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<NS1:createShipmentResponse xmlns:NS1="http://www.royalmailgroup.com/api/ship/V1">
<NS1:integrationHeader>
<dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2013-12-02T17:06:13</dateTime>
<version xmlns="http://www.royalmailgroup.com/integration/core/V1">1</version>
<identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
<applicationId>111111113</applicationId>
<transactionId>420642961</transactionId>
</identification>
</NS1:integrationHeader>
<NS1:integrationFooter>
<errors xmlns="http://www.royalmailgroup.com/integration/core/V1">
<error>
<errorCode>E1101</errorCode>
<errorDescription>Name is a required field</errorDescription>
</error>
</errors>
有人能告诉我为什么这不适用于第二次回复吗?如果我在有效响应中有警告消息,那么我也无法提取该值。是因为这是在integrationFooter中吗?
答案 0 :(得分:0)
现在发生了这件事,所以加上答案。
在第二种情况下,由于命名空间问题,它无法正常工作。
元素errors
使用默认命名空间,与其父元素integrationFooter
不同。在xpath
中,没有名称空间被引用到元素错误及其子元素。
以下是适用于第二种情况的脚本:
def xml = '''
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<NS1:createShipmentResponse xmlns:NS1="http://www.royalmailgroup.com/api/ship/V1">
<NS1:integrationHeader>
<dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2013-12-02T17:06:13</dateTime>
<version xmlns="http://www.royalmailgroup.com/integration/core/V1">1</version>
<identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
<applicationId>111111113</applicationId>
<transactionId>420642961</transactionId>
</identification>
</NS1:integrationHeader>
<NS1:integrationFooter>
<errors xmlns="http://www.royalmailgroup.com/integration/core/V1">
<error>
<errorCode>E1101</errorCode>
<errorDescription>Name is a required field</errorDescription>
</error>
</errors>
</NS1:integrationFooter>
</NS1:createShipmentResponse>
</soapenv:Body>
</soapenv:Envelope>'''
def holder = new com.eviware.soapui.support.XmlHolder( xml )
holder.declareNamespace('a','http://www.royalmailgroup.com/api/ship/V1')
holder.declareNamespace('b','http://www.royalmailgroup.com/integration/core/V1' )
def errorCode = holder.getNodeValue( "//a:integrationFooter/b:errors/b:error/b:errorCode" )
assert errorCode == 'E1101'