WCF サービス .net をサーバーとして、PHP-soap をクライアントとして使用する場合は、ガイドラインに厳密に従う必要があります。PHP-soap のドキュメントは、デバッグするのに十分ではなく、明確でもありません。PHP nusoap は、ドキュメンテーションに関しては少し優れていますが、例としてはまだ十分ではなく、初心者にとっては良い選択ではありません。nusoap にはいくつかの例がありますが、それらのほとんどは機能しません。次のデバッグ チェックリストをお勧めします。
- web.config ファイルのバインディングを確認してください。PHP の場合は「<strong>basicHttpBinding」でなければなりません
- PHP、$client->__soapCall()関数はすべての引数を配列として送信するため、Web サービス関数が入力パラメーターを配列として必要とする場合、引数は追加の配列にある必要があります。明確にするために、例#3を以下に示します。
- 必要に応じて、「<strong>array('soap_version' => SOAP_1_1)」または「<strong>array('soap_version' => SOAP_1_2)」を SoapClient() オブジェクトに渡して、SOAP バージョンを明示的に宣言します。
- リクエストとレスポンスの文字列を読み取るために、常に「array( "trace" => 1 )」を SoapClient オブジェクトに宣言してみてください。
- 「<strong>__getLastResponse();」を使用 応答文字列を読み取る関数。
- 「<strong>__getLastRequest();」を使用 リクエスト文字列を読み取る関数。
重要: パラメータとして渡された値に対して NULL が返される場合は、次のような .cs(.net) ファイルを確認してください。
[ServiceContract]
public interface IDynamicWCFService
{
[OperationContract]
string HelloYesterday(string test);
}
変数名はここに渡され、PHP で呼び出すときに一致する必要があります。以下の例では、これを「テスト」としています。
例 #1 : HelloYesterday 関数の単一パラメーターで php-soap を使用する
<?php
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new SoapClient($url, array( "trace" => 1 ));
$result = $client->HelloYesterday(array('test' => 'this is a string'));
var_dump($result);
$respXML = $client->__getLastResponse();
$requXML = $client->__getLastRequest();
echo "Request: <br>";
var_dump($requXML);
echo "Response: <br>";
var_dump($respXML);
?>
例 #2 : HelloYesterday 関数の単一パラメーターで nusoap を使用する
<?php
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new nusoap_client($url, 'wsdl', $proxyhost, $proxyport, $proxyusername, $proxypassword); $client->soap_defencoding = 'UTF-8'; // this is only if you get error of soap encoding mismatch.
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
// Doc/lit parameters get wrapped
$param = array('test' => ' This is a string for nusoap');
$result = $client->call('HelloYesterday', array('parameters' => $param), '', '', false, true);
// Check for a fault
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>
もう 1 つの例… 配列をパラメーターとして渡すか、混合型パラメーターを渡し、次の例を確認します。
例 #3:配列パラメーターを含む混合型パラメーターを SOAP 関数に渡す。.net 操作ファイルの例
[ServiceContract]
public interface IDynamicWCFService
{
[OperationContract]
string[] HelloYesterday (string[] testA, string testB, int testC );
}
PHP コード
<?php
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new SoapClient($url, array( "trace" => 1 ));
$params = array(
"testA" => array(0=>"Value1",1=>"Value2",2=>"Value3"),
"testB" => “this is string abc”,
"testC" =>123
); // consider the first parameter is an array, and other parameters are string & int type.
$result = $client->GetData($params);
var_dump($result);
$respXML = $client->__getLastResponse();
$requXML = $client->__getLastRequest();
echo "Request: <br>";
var_dump($requXML);
echo "Response: <br>";
var_dump($respXML);
?>
上記の例が役立つことを願っています。