将SOAP转换为PHP调用函数

时间:2018-03-22 19:10:24

标签: php soap

我正在尝试学习如何使用SoapUI将Web服务集成到我的网站。我一直在尝试遵循PHP的文档,但它非常令人困惑。我的问题是:我如何将这个soap代码翻译成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文件获得的肥皂请求代码: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>

2 个答案:

答案 0 :(得分:1)

我不知道是否有人需要这个,但我发现了问题。我现在只是学习SOAP,并意识到为了将SOAP调用转换为PHP,需要将所有标签视为数组。因此,给定请求调用的结构,PHP请求应如下所示:

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

答案 1 :(得分:0)

首先,错误是使用函数名作为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键更新request数组(根据Carlos帖子更新):

$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
                (
                )
        )
)