难以使用PHP函数导航SOAP客户端WSDL

时间:2013-06-19 16:55:20

标签: php xml soap wsdl soap-client

我正在尝试使用公共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服务,我没有必要指定参数名称。

因此,能够理解呼叫结构是简化所有这一切的关键。

0 个答案:

没有答案