まず、不明なSOAPサービスを扱っている場合は、SoapUIを入手してください。SoapUIはWSDLファイルを読み取り、Soapメソッド、パラメーター、および戻り値に関連するほぼすべてを確認できるようにします(ライブサービスをあえて呼び出す場合は、重要なことを何も行わないサンドボックスサーバーがあることを願っています)。
ただし、SoapUIは、リクエストを受信し、準備した既定のリクエストで応答するモックサービスを作成することで、そこで役立ちます。これが、実際のサービスに触れることなく、リンクされたWSDLから実際のコード例に到達した方法です。
SoapUIの設定
SoapUIで新しいプロジェクトを作成し、WSDLの場所を指定します。このプロジェクトに名前を付けることができます。
次に、SoapUIはWSDLの内容を読み取り、記述されたすべての要求を含むプロジェクトを作成します。その後、サービスが提供するメソッドと、サービスに入力する必要のあるパラメーターの種類をツリーとして確認します。vehiclePassedTest
このツリーを開くと、検出されたすべてのメソッドの「リクエスト1」に移動します。これにより、(メソッドからの)次のような無料バージョン(有料バージョンの方がフォームに入力する方が少し快適です)でXMLが表示されます。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tr="http://tr.gov.tp.stp.ws.PassedVehicleTestService">
<soapenv:Header>
<tr:password>?</tr:password>
<tr:username>?</tr:username>
</soapenv:Header>
<soapenv:Body>
<tr:vehiclePassedTest>
<chassisNo>?</chassisNo>
<plateNo>?</plateNo>
<plateCode>?</plateCode>
<plateCategory>?</plateCategory>
<plcEmiCode>?</plcEmiCode>
<currentUserName>?</currentUserName>
</tr:vehiclePassedTest>
</soapenv:Body>
</soapenv:Envelope>
疑問符は、データを提供する必要がある場所です。このリクエスト構造は、PHPのSoapClientを使用して作成する必要があります。
これをあざけりましょう。モックとは、SoapUIがリクエストを受け入れる独自のSoapサーバーを起動することを意味します。通常、127.0.0.1:8080で実行されます。プロジェクト「PassedVehicleTestService」を右クリックし、「NewMockService」を選択します。名前を受け入れて、[OK]を押します。
モックするメソッドを右クリックします。「モックサービスに追加」を選択し、前の手順で作成したサービスを選択します。「はい」と答えて、模擬応答エディターを開きます。そこに、サービスが入力するデータの疑問符が付いた、回答のXML構造が表示されます。このサービスからのすべての応答では、1つの回答を文字列として許可するため、返される素敵なものを記述してください。必要に応じて、後でこのサービスに他のメソッドを追加できます。
「MockService1」を右クリックして、「最小化を開始」を選択します。これにより、Soapサーバーが起動し、着信要求を待ちます。
モック用にPHPSoapClientをセットアップします。
あなたは2つのことを知る必要があります。まず、WSDLの場所。このファイルには、リクエストに使用される実サーバーのアドレスが含まれていますが、PHPではこれをオーバーライドできます。したがって、必要な2番目の情報は、実行中のモックサービスのアドレスです。
SoapUIは、WSDLからのアドレスをリクエストエディターに表示します。あなたの場合、それはhttp://181.24.80.32/ws/services/PassedVehicleTestService
-モックサービスが実行されhttp://127.0.0.1:8080/ws/services/PassedVehicleTestService
ます-IPとポートが置き換えられ、パスが保持されます。
これにより、PHPコードの最初の行が表示されます。
$options = array(
'location' => 'http://127.0.0.1:8080/ws/services/PassedVehicleTestService',
);
$client = new SoapClient("http://www.quickregistration.ae/temp/PassedVehicleTestService.xml", $options);
その後、モックサービスと通信できるように構成されたSoapClientができます。後で実際のサービスを使用する場合は、「location」の行を配列から外し、他の構成パラメーターを追加する場合はそのままにしておきます。
モックに話しかける
クライアントを使用すると、次のことができます$client->nameOfSoapMethod(paramStructure)
。パラメータ構造は通常、配列またはオブジェクトと文字列のようなスカラー値の混合です。それが私が最初に試みることです:
$result = $client->vehiclePassedTest(array());
var_dump($result);
次に、SoapUIを調べて何が起こるかを確認します。phpスクリプトからの出力:
Notice: Array to string conversion in [...]/soap.php on line 20
string(1) "?"
SoapUIは言う:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tr.gov.tp.stp.ws.PassedVehicleTestService">
<SOAP-ENV:Body>
<ns1:vehiclePassedTest>
<chassisNo>Array</chassisNo>
<plateNo/>
<plateCode/>
<plateCategory/>
<plcEmiCode/>
<currentUserName/>
</ns1:vehiclePassedTest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
それは正しいアプローチではありませんでした。配列は文字列「Array」に変換され、最初のパラメータとして配置されました。残りは空です。いいですね。soap呼び出しは複数のパラメーターを受け入れる可能性があることを知っています。これはこれらのサービスの1つです。
$result = $client->vehiclePassedTest('chassisNo', 'plateNo', 'plateCode', 'plateCategory', 'plcEmiCode', 'currentUserName');
これはSoapUIに正しく表示されますが、ヘッダーはまだありません。
リクエストにSoapHeaderを追加する
SoapClientは、という名前のメソッドを提供し__setSoapHeaders()
、クラスがありSoapHeader
ます。
説明によると、setSoapHeaders()は1つのSoapHeaderオブジェクトまたはSoapHeaderオブジェクトの配列を受け入れます。1つ作成し、それを渡して、何が起こるかを見てみましょう。
$username = new SoapHeader();
$client->__setSoapHeaders($username);
$result = $client->vehiclePassedTest('chassisNo', 'plateNo', 'plateCode', 'plateCategory', 'plcEmiCode', 'currentUserName');
var_dump($result);
PHPは言う:Warning: SoapHeader::SoapHeader() expects at least 2 parameters, 0 given
$username = new SoapHeader('namespace', 'username', 'MyUserName');
これは機能します。SoapUIは言う:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tr.gov.tp.stp.ws.PassedVehicleTestService" xmlns:ns2="namespace">
<SOAP-ENV:Header>
<ns2:username>MyUserName</ns2:username>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:vehiclePassedTest><chassisNo>chassisNo</chassisNo><plateNo>plateNo</plateNo><plateCode>plateCode</plateCode><plateCategory>plateCategory</plateCategory><plcEmiCode>plcEmiCode</plcEmiCode><currentUserName>currentUserName</currentUserName></ns1:vehiclePassedTest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP-ENV:Envelope要素の2つのxmlns属性に注意してください。元のリクエストでは、ユーザー名が名前空間「tr」に含まれている必要がありますが、「tr」は「xlmns:tr」として定義されている文字列へのショートカットにすぎません。この背後にある文字列は、必要な名前空間です(ただし、すでに機能している可能性があります)実際のサービス)。
$username = new SoapHeader("http://tr.gov.tp.stp.ws.PassedVehicleTestService", 'username', 'myUser');
$password = new SoapHeader("http://tr.gov.tp.stp.ws.PassedVehicleTestService", 'password', 'yetAnotherPassword');
$client->__setSoapHeaders(array($username, $password));
ご覧のとおり、これによりヘッダーが正しく定義されます。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tr.gov.tp.stp.ws.PassedVehicleTestService">
<SOAP-ENV:Header>
<ns1:username>myUser</ns1:username>
<ns1:password>yetAnotherPassword</ns1:password>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:vehiclePassedTest><chassisNo>chassisNo</chassisNo><plateNo>plateNo</plateNo><plateCode>plateCode</plateCode><plateCategory>plateCategory</plateCategory><plcEmiCode>plcEmiCode</plcEmiCode><currentUserName>currentUserName</currentUserName></ns1:vehiclePassedTest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
エンベロープ要素に2つの名前空間はなく、すべての要素は名前空間「ns1」です。これは機能するはずです。
最終的なコード:
$options = array(
'location' => 'http://127.0.0.1:8080/ws/services/PassedVehicleTestService',
);
$client = new SoapClient("http://www.quickregistration.ae/temp/PassedVehicleTestService.xml", $options);
$username = new SoapHeader("http://tr.gov.tp.stp.ws.PassedVehicleTestService", 'username', 'myUser');
$password = new SoapHeader("http://tr.gov.tp.stp.ws.PassedVehicleTestService", 'password', 'yetAnotherPassword');
$client->__setSoapHeaders(array($username, $password));
$result = $client->vehiclePassedTest('chassisNo', 'plateNo', 'plateCode', 'plateCategory', 'plcEmiCode', 'currentUserName');
var_dump($result);