職場で取り組んでいる内部 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」名前空間を指定すると、さまざまな方法を試し、ある程度の前進が見られました。しかし、私がそれ以下に得たものは、それ以上のものではありません。
これが私のソープ呼び出し関数です (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();
}
ご覧のとおり、そこにはいくつかのテスト コードがあります。今は醜いですが、これを処理する方法を理解する必要があります。このすべてを事前に実行してくれるツールを誰かが知っていれば、それは素晴らしいことです。
基本的に私ができるようにしたいのは、関数を呼び出す前に関数のパラメーターを識別することです。関数にパラメーターが 1 つしかない場合は、呼び出している関数に基づいて、入力された変数を 1 つのパラメーター名にマップして呼び出したいと思います。
これは Behat 内で機能やシナリオを記述するときに便利です。これにより、「次に、"GOOG" を使用して "GetQuote" への SOAP 呼び出しを行う」などの Gherkin スタイルの行を記述できるため、名前の指定について心配する必要がなくなります。パラメータ。この WSDL の場合、1 つの変数を渡すだけでそれを処理できないというのは、少しばかげていることがわかりました。パラメータ名を指定する必要のない別の SOAP サービスを見てきました。
したがって、呼び出し構造を理解できることが、これらすべてを簡素化するための鍵となります。