我可以在网上找到我的问题的答案,所以我会问你们。
我使用此 WSDL 定义的副本 (http://www.webservicex.com/globalweather.asmx?WSDL) 使用 SoapUI 5.0 配置了 MockService。
我无法使用 PHP SoapClient 来测试 MockService:
ini_set("soap.wsdl_cache_enabled", 0);
$client = new \SoapClient("http://172.20.1.52:8088/mockGlobalWeatherSoap?WSDL", array('trace' => 1));
$response = $client->__soapCall('GetCitiesByCountry', array());
但是,我开始尝试定义以确保某些方法的强制参数。
例如,我想确保 CountryName 成为 GetCitiesByCountry() 方法的强制参数:
<s:element name="GetCitiesByCountry">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="CountryName" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
但是,无论我向 SoapUI 抛出什么,我的 MockService 总是会向我发送正确的响应,无论参数是否已提供。
有人可以向我解释一下,如何确保 SoapUi 中 WSDL 文件中描述的基本验证吗?
我花了几个小时,但在互联网上找不到任何相关答案。
提前非常感谢,亲切的问候,
R.
PS:我在 SoapUI 中尝试了同样的操作,发送一个缺少参数的虚拟肥皂请求,但 SoapUI 不在乎并向我发送回复。
SoapUI 模拟不模拟 WSDL 中的内容。它只会模拟响应。您必须配置 SoapUI 来模拟您想要的特定响应。
您尝试过 SoapUI 文档吗? http://www.soapui.org/Service-Mocking/simulated-complex-behaviour.html
在 OnRequest 脚本选项卡中添加以下脚本,它将在发送模拟响应之前使用 WSDL 验证传入请求。
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlValidator
import com.eviware.soapui.impl.wsdl.panels.mockoperation.WsdlMockRequestMessageExchange
def wsdlcontext = context.mockService.getMockedInterfaces()[0].getDefinitionContext()
def validator = new WsdlValidator(wsdlcontext);
def operation = mockRequest.soapAction.substring(mockRequest.soapAction.lastIndexOf('/') +1)
log.info context.mockService.toString() + "::" + operation
def wsdlMockOperation = context.mockService.getMockOperationByName(operation)
def msgExchange = new WsdlMockRequestMessageExchange(mockRequest, wsdlMockOperation);
def errors = validator.assertRequest(msgExchange, false);
if (errors.length > 0 ) {
log.error context.mockService.toString() + "::" + operation + " Request Validation Failed"
throw new Exception("VALIDATION ERRORS: " + errors.collect(){ '\n' + it })
}