簡體   English   中英

將SOAP轉換為PHP調用函數

[英]Translating SOAP to PHP call function

我正在嘗試學習如何使用SoapUI將Web服務集成到我的網站。 我一直在嘗試遵循PHP的文檔,但這非常令人困惑。 我的問題是:如何將該肥皂代碼轉換為PHP,因此可以調用SOAP函數。 這是我到目前為止所得到的:

  $wsdl = "http://api.rlcarriers.com/1.0.2/ShipmentTracingService.asmx?wsdl";

  $request = [
'APIKey' => 'xxxxxxxxxxxxxxxxxxxxxx',
'traceNumbers' => $pro,
'TraceType' => 'PRO',
'FormatResults' => 'false',
'IncludeBlind' => 'false',
'OutputFormat' => 'Standard'
];

  $client = new SoapClient($wsdl);

  $result = $client->TraceShipment($request);  

  print_r($result); 

但是,這不起作用。 我不知道我在做什么錯。 感謝提供的任何幫助。 我花了數小時試圖找出答案,這讓我發瘋。 這是通過以下wsdl文件通過SoapUI獲得的肥皂請求代碼: http : //api.rlcarriers.com/1.0.2/ShipmentTracingService.asmx? wsdl

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:rlc="http://www.rlcarriers.com/">
       <soap:Header/>
       <soap:Body>
          <rlc:TraceShipment>
             <!--Optional:-->
             <rlc:APIKey>******************</rlc:APIKey>
             <!--Optional:-->
             <rlc:request>
                <!--Optional:-->
                <rlc:TraceNumbers>
                   <!--Zero or more repetitions:-->
                   <rlc:string>143248716</rlc:string>
                </rlc:TraceNumbers>
                <rlc:TraceType>PRO</rlc:TraceType>
                <rlc:FormatResults>false</rlc:FormatResults>
                <rlc:IncludeBlind>false</rlc:IncludeBlind>
                <rlc:OutputFormat>Standard</rlc:OutputFormat>
                <!--Optional:-->
                <rlc:CustomerData></rlc:CustomerData>
             </rlc:request>
          </rlc:TraceShipment>
       </soap:Body>
    </soap:Envelope>

我不知道是否有人會需要這個,但我發現了問題所在。 我現在只是在學習SOAP,並且意識到為了將SOAP調用轉換為PHP,需要將所有標簽視為數組。 因此,根據請求調用的結構,PHP請求應如下所示:

$request = array(
    'APIKey' => '***********************',
    'request' => array(
        'TraceNumbers' => array(
            'string' => $pro
            ),
        'TraceType' => 'PRO',
        'FormatResults' => 'false',
        'IncludeBlind' => 'false',
        'OutputFormat' => 'Standard'
    )
);

第一個錯誤是將函數名稱用作SoapClient的方法。

正確的是使用本機方法SoapClient :: __ soapCall() ,並且函數名稱用作第一個參數,如下所示:

$client = new SoapClient($wsdl);
$result = $client->__call('TraceShipment', $request);

為了簡化調試,請使用try ... catch塊,該塊使您可以訪問服務器返回的消息:

try {
  $result = $client->__soapCall('TraceShipment', $request);
} catch (Exception $e) {
  print_r($e);
  print_r($client);
}

第二個錯誤
$request參數應該是SoapServer接受的關聯數組的數組,即兩級數組

$request = [[
  //...
]];

第三個錯誤
強制參數是

<s:element minOccurs="0" maxOccurs="1" name="APIKey" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="request" type="tns:ShipmentTracingRequest"/>

因此,請通過request密鑰(根據Carlos post更新)來更新$request數組:

$request = [[
      'APIKey' => 'xxxxxxxxxxxxxxxxxxxxxx',
      'request' => [
          'TraceNumbers' => [
              'string' => $pro
          ],
          'TraceType' => 'PRO',
          'FormatResults' => 'false',
          'IncludeBlind' => 'false',
          'OutputFormat' => 'Standard'
      ]
]];

修復后,您將獲得如下響應:

stdClass Object
(
    [TraceShipmentResult] => stdClass Object
        (
            [WasSuccess] => 1
            [Messages] => stdClass Object
                (
                )

            [Result] => stdClass Object
                (
                )
        )
)

暫無
暫無

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

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