Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SOAP转换为PHP调用函数_Php_Soap - Fatal编程技术网

将SOAP转换为PHP调用函数

将SOAP转换为PHP调用函数,php,soap,Php,Soap,我正在尝试学习如何使用SoapUI将Web服务集成到我的网站。我一直在尝试遵循PHP的文档,但它非常混乱。我的问题是:如何将此soap代码转换为PHP,以便调用soap函数。到目前为止,我得到的是: $wsdl = "http://api.rlcarriers.com/1.0.2/ShipmentTracingService.asmx?wsdl"; $request = [ 'APIKey' => 'xxxxxxxxxxxxxxxxxxxxxx', 'traceNumbers'

我正在尝试学习如何使用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文件使用SoapUI获得的soap请求代码:


******************
143248716
赞成的意见
假的
假的
标准

第一个错误是将函数名用作
SoapClient
的方法

正确的做法是使用本机方法和函数名作为第一个参数,如下所示:

$client = new SoapClient($wsdl);
$result = $client->__call('TraceShipment', $request);
$request = array(
    'APIKey' => '***********************',
    'request' => array(
        'TraceNumbers' => array(
            'string' => $pro
            ),
        'TraceType' => 'PRO',
        'FormatResults' => 'false',
        'IncludeBlind' => 'false',
        'OutputFormat' => 'Standard'
    )
);
为便于调试,请使用允许您访问从服务器返回的消息的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"/>

修复后,您可能会得到如下响应:

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

            [Result] => stdClass Object
                (
                )
        )
)

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

$client = new SoapClient($wsdl);
$result = $client->__call('TraceShipment', $request);
$request = array(
    'APIKey' => '***********************',
    'request' => array(
        'TraceNumbers' => array(
            'string' => $pro
            ),
        'TraceType' => 'PRO',
        'FormatResults' => 'false',
        'IncludeBlind' => 'false',
        'OutputFormat' => 'Standard'
    )
);

看起来您刚刚发布了API密钥。您需要立即更改/撤销它。我认为我的$request数组可能有问题,因为它似乎不起作用。我得到的是这样的东西:SoapFault对象([message:protected]=>看起来我们没有XML文档[string:Exception:private]@Carlos我已经用参数变量的两级数组更新了我的答案。你的“第一个错误”是错误的。除非您需要传递额外的参数,或者没有WSDL,否则根本不需要直接调用
\uuuuuSOAPCALL
。另一方面,使用
\uuSOAPCALL
需要您以不同的格式传递参数,这进一步混淆了问题。请参阅本手册页面上的官方和用户提供的说明:Still不工作。我现在得到了:SoapFault对象([message:protected]=>服务器无法处理请求。-->对象引用未设置为对象的实例。对我来说,它可以工作…即使使用这是一个低级API函数
\uSOAPCall()