如何使用SoapClient将参数传递给函数?

时间:2015-10-16 09:38:06

标签: php xml soap soap-client

不幸的是,我没有任何SOAP经验,请原谅我最终使用错误的符号 -

我获得了2个URL和一个XML字符串,我正在尝试从远程SOAP服务器获取XML响应。

第一个URL是一个WSDL文档,我将它提供给SoapClient构造函数:

$client = new SoapClient(URL_1, array('trace' => 1, 'exceptions' => 0));

第二个URL是SOAP服务器,我在这里使用它:

$client->__setLocation(URL_2);

这很有效,我可以使用以下方法检索类型函数

print_r( $client->__getTypes() );
print_r( $client->__getFunctions() );

这是输出的有趣部分:

[28] => struct GetServiceInfo {
 UserAuthentification UserAuthentification;
}

[74] => struct UserAuthentification {
 string UserId;
 string Password;
 string SessionKey;
}

[3] => GetServiceInfoResponse GetServiceInfo(GetServiceInfo $parameters)

我的问题是调用上述GetServiceInfo 函数

我得到了这个XML字符串,它与SoapUi程序很好地配合使用:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://...../V1">
  <soap:Header>.....</soap:Header>   
  <soap:Body>
      <v1:GetServiceInfo>
         <UserAuthentification>
            <UserId>MY_USERNAME</UserId>
            <Password>MY_PASSWORD</Password>
          </UserAuthentification>
      </v1:GetServiceInfo>
   </soap:Body>
</soap:Envelope>

如何在PHP脚本中传递此参数?

我试过了:

$result = $client->GetServiceInfo(array(
        new SoapParam( "UserAuthentification", array(   # ERROR, WANTS STRING HERE
        new SoapParam( "UserId", "MY_USERNAME" ),
        new SoapParam( "Password", "MY_PASSWORD" ),
)))); 

var_dump( $client->__getLastRequest() );
var_dump( $client->__getLastResponse() );

print_r( $result );

但是得到错误:

Warning: SoapParam::SoapParam() expects parameter 2 to be string, array given in soap.php

Fatal error: SOAP-ERROR: Encoding: object has no 'UserAuthentification' property in soap.php

我想我在这里遗漏了一些小事,请帮忙。

更新

我进一步采取了以下步骤:

$user = array('UserId' => 'MY_USERNAME', 'Password' => 'MY_PASSWORD');
$params = array('UserAuthentification' => $user);
$result = $client->GetServiceInfo($params);

现在我收到了错误:

  

[FaultDescription] =&gt;无法识别服务

     

[FaultReason] =&gt; wsa:To缺失,给定的URL /服务可以   不会映射到现有服务

1 个答案:

答案 0 :(得分:1)

服务器使用WS-Addressing(由FaultReason证明 - 关键字为wsa:To),常规PHP SoapClient扩展不支持。

我还没有使用WS-Addressing,但我最近正在分析我们将来需要的项目的API。

请注意可能有用的this projectthis other project(可以轻松搜索更多PHP WS-Addressing)。同样,我只做过研究,没有任何实际操作经验来帮助您使用实际代码:)