簡體   English   中英

變量發送后,WSDL服務響應,PHP

[英]wsdl service response once variables are sent, php

我是SOAP WSDL函數的新手。 我有一個客戶,該客戶從一家從事汽車測試的公司獲得了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;  
    ?>

首先:如果要處理未知的Soap服務,請獲取SoapUI SoapUI將讀取WSDL文件,並允許您查看與Soap方法,參數和返回值相關的幾乎所有內容(如果您敢於調用實時服務-希望有一個沙盒服務器可以執行任何重要操作)。

但是,SoapUI可以通過創建一個模擬服務來幫助您,該服務可以接收您的請求並以您准備的罐裝請求進行響應。 這是我從您鏈接的WSDL到工作代碼示例的方法,而無需涉及實際服務。

設置SoapUI

在SoapUI中創建一個新項目,並提供WSDL的位置。 您可以為這個項目命名。

然后,SoapUI讀取WSDL的內容,並創建包含所有描述的請求的項目。 之后,您將以樹的形式查看服務提供的方法以及必須輸入的參數類型。 打開此樹將使您進入檢測到的每個方法的“請求1”,它以如下形式(來自vehiclePassedTest方法)顯示一些免費版本的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”,然后選擇“ New MockService”。 接受名稱,然后按確定。

右鍵單擊要模擬的方法。 選擇“添加到模擬服務”,然后從上一步中選擇創建的服務。 回答是,以打開模擬響應編輯器。 在那里,您將看到答案的XML結構,其中包含將要填寫的服務數據的問號。 該服務的所有響應都允許將一個答案作為字符串,因此請寫出可以返回的漂亮內容。 如果需要,您可以稍后將其他方法添加到此服務中。

右鍵單擊“ MockService 1”,然后選擇“最小化啟動”。 這將啟動Soap服務器,它將等待傳入的請求。

設置PHP SoapClient進行模擬。

您需要知道兩件事。 首先是WSDL的位置。 該文件包含用於請求的真實服務器的地址,但是PHP允許覆蓋此地址。 因此,您需要的第二個信息是正在運行的模擬服務的地址。

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調用可以接受多個參數,而這是這些服務之一。

$result = $client->vehiclePassedTest('chassisNo', 'plateNo', 'plateCode', 'plateCategory', 'plcEmiCode', 'currentUserName');

這在SoapUI中正確顯示,但是標題仍然丟失。

將SoapHeader添加到請求中

SoapClient提供了一個名為__setSoapHeaders()的方法,還有一個SoapHeader類。

該描述說setSoapHeaders()接受一個SoapHeader對象或一組SoapHeader對象。 讓我們創建一個,傳遞它,看看會發生什么:

$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元素中的兩個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>

信封元素中沒有兩個名稱空間,每個元素都具有名稱空間“ 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);

嘗試這樣的事情。 為我工作。

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();
}

並檢查您是否已在服務器中安裝了php-soap軟件包。

Greatings。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM