2

私はSOAPWSDLFUNCTIONSを初めて使用します。車のテストを扱っている会社からwsdlファイルを受け取ったクライアントがいます。私のクライアントは彼らの下請け業者です。ナンバープレートやカテゴリーなどの情報をアップロードするように言われ、詳細が送信されると、サーバーから成功または失敗のいずれかの応答があります。親切にこれを手伝ってください。

さまざまな情報を閲覧して、次のようなことをしようとしましたが、機能しません

    <?php
$data = array('1'=>'value','2'=>'value','3'=>'value','4'='value','5'=>'value');
$wsdl ='http://181.24.80.32/ws/services/servicename';
$client = new SoapClient($wsdl); 
$response = $client->servicenamerequest($data);  

echo $response->servicenamereturn;  
    ?>
4

2 に答える 2

3

まず、不明な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);
于 2012-12-15T17:32:53.937 に答える
1

try something like this. Works for me.

try {
  $client = new SoapClient("http://wsdl",  array('trace' => 1));
  $data = $client->someFunction(array('parma1' => 'value1', 'param2' => 'value2'));
  print_r($data);
} catch (SoapFault $fault) {
   trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
   exit();
}

And check is you have installed php-soap package in your server.

Greatings.

于 2012-12-15T15:07:49.240 に答える