我正在尝试使用公共SOAP API来准备测试我们正在工作的内部SOAP API。我遇到了自动将方法名称与参数名称相关联的问题。
更具体地说,我正在对http://www.webservicex.net/stockquote.asmx?WSDL进行测试,我正在尝试编写一个我可以在Behat中使用的函数,以便我们的QA人员可以轻松地创建指定新函数的新方案(因为它们已创建)我每次都写一个新的功能。
为此,我为SoapClient :: __ soapCall()构建了一个函数包装器。我已经能够调用特定的函数来实现这一点:
<?php
public function iGetAQuoteFor($symbol) {
$response = $this->client->GetQuote(array('symbol' => $symbol));
$quote = simplexml_load_string($response->GetQuoteResult)->Stock;
echo "Quote:\n" . print_r($quote, true) . "\n";
}
?>
显然,我需要确定我发送给SOAP服务的参数才能使其生效。但要做到这一点,我需要能够将函数名称映射到选项名称。我尝试使用SimpleXML处理WSDL,但是我很难在其中导航结果。当我使用SimpleXML函数'children'并指定'wsdl'命名空间时,我尝试了一些不同的方法并取得了一些进展。但是我得到的不是更好。
这是我的soap调用函数(写成Behat上下文):
/**
* Calls a specific SOAP function (defined in the WSDL).
*
* @param string $functionName
* @param string $options (optional, no implemented yet)
*
* @Given /^I make a SOAP call to "([^"]*)" with "([^"]*)"$/
* @Given /^I make a SOAP call to "([^"]*)"$/
*/
public function iMakeASOAPCallTo($functionName, $passedOptions = NULL) {
//Deal with the options
$options = array($passedOptions);
if (stristr($passedOptions, ',')) {
$options = explode(',', $passedOptions);
}
else if (empty($passedOptions)) {
$options = array();
}
//Also should try to figure out how to match the function call to the option wrapper
#Function placeholder
//Attempt to make the call
try {
$result = $this->client->__soapCall($functionName, $options);
}
catch (\Exception $e) {
throw new Exception("Failed to call SOAP function.");
}
//Process the result
if (!empty($result)) {
$result = $this->decodeSOAPResult($functionName, $result);
if (!empty($result)) {
echo " It returns:\n" . print_r($result, true) . "\n";
}
else {
throw new Exception("Invalid result from function call.");
}
}
else {
throw new Exception("Failed result or exception from function call.");
}
}
这是我的函数,它尝试在建立与soap服务的连接后获取架构详细信息。
private function buildSchemaDetails() {
$xml = simplexml_load_file($this->soapURL);
echo "\n" . print_r($xml, true) . "\n";
echo "For the ns:\n";
$element = $xml->getDocNamespaces();
echo "\n" . print_r($element, true) . "\n";
$element = $xml->children('wsdl', true)->types->children();
echo "\n" . print_r($element, true) . "\n";
die();
}
如你所见,我有一些测试代码。现在很难看,但我需要弄清楚如何处理这个问题。如果有人知道一个工具可以提前为我做这一切,那就太棒了。
基本上我想要做的是在我尝试调用函数之前识别函数的参数。如果函数只有一个参数,那么我想根据我调用的函数将输入的变量映射到一个参数名称,然后调用它。
这在Behat编写功能和场景时非常有用,因为它允许我编写一个Gherkin风格的行,例如'然后我用“GOOG”对“GetQuote”进行SOAP调用,而不必担心指定参数的名称。在这个WSDL的情况下,我发现它有点荒谬,不能只传入一个变量并完成它。我已经看到了anther SOAP服务,我没有必要指定参数名称。
因此,能够理解呼叫结构是简化所有这一切的关键。