PHP-Soap传递方法参数

时间:2009-05-01 03:24:02

标签: php soap

我对SOAP没有相对经验。我试图使用WSDL模式为客户端使用Web服务。我在使用该方法传递参数时遇到问题,并让它们根据需要显示在请求中的参数。我正在使用标准的php soap类。

我需要将SOAP请求的结构如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/">
    <SOAP-ENV:Body>
        <ns1:DoLogin>
            <ns1:request>
                <ns1:Session>
                    <ns1:SessionId>00000000-0000-0000-0000-000000000000</ns1:SessionId>
                </ns1:Session>
                <ns1:UserCredential>
                    <ns1:UserName>username</ns1:UserName>
                    <ns1:Password>password</ns1:Password>
                    <ns1:ApplicationID>00000000-0000-0000-0000-000000000000</ns1:ApplicationID>
                    <ns1:ClientID>00000000-0000-0000-0000-000000000000</ns1:ClientID>
                    <ns1:ClientVersion>V1.0</ns1:ClientVersion>
                </ns1:UserCredential>
            </ns1:request>
        </ns1:DoLogin>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

在php中我调用这样的函数:

$client->DoLogin($args);

请求最终如下:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/"><SOAP-ENV:Body><ns1:DoLogin/></SOAP-ENV:Body></SOAP-ENV:Envelope>

无论我如何传递args(单个varabiables,数组,类对象),我都无法获得具有该结构的请求。

任何人都可以帮助我吗?我相信它会变得非常简单。

5 个答案:

答案 0 :(得分:14)

今天处理一个稍微相关的问题时,我发现以下PHP生成了如下所示的SOAP请求:

$sc = new SoapClient($url);
$params = array('step' => 'ShippingInfo', 'value' => "hello");
$result = $sc->__soapCall('runStep', array('parameters' => $params));
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
 <SOAP-ENV:Body>
  <ns1:runStep>
     <ns1:step>ShippingInfo</ns1:step>
     <ns1:value>hello</ns1:value>
  </ns1:runStep>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我发现的一个问题是,如果我传递的参数($ params)不符合WSDL文件中指定的参数,那么SOAP客户端生成的消息看起来与您抱怨的类似 - 一条消息正文不包含任何数据值。我想知道你的问题是否在这里。

另外,请注意上面的PHP如何使用两个数组来传递参数。第一个数组包含参数及其名称。第二个包含第一个数组。我知道有趣的语法。 : - )

仅供参考,上面的示例代码用于与具有以下合同的C#.Net WCF服务进行通信:

[OperationContract]
string runStep(string step, string value);

答案 1 :(得分:3)

试试这个:

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray));

这对我来说是一个.NET Web服务。

答案 2 :(得分:1)

This is valid way: right mr.bgondy
$result = $soapClient->methodsomefunction("params1"=>"value","params2"=>"value2");

我的问题是你说过

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray));

上面的.net web服务代码但是当我为.net asp web服务尝试过这个方法时,参数值不解析我是这么认为的,因为当我删除了params = value not effect same“发生了未知错误!”来自iframe的.net asp web服务。

答案 3 :(得分:0)

我遇到了同样的问题。

这个为我解决了:

$result = $soapClient->somefunction(array( "param1" => "value1", "param2" => "value2" ));

参数类型(和顺序)必须与当前wsdl定义的相同。 (字符串,对象等)

答案 4 :(得分:-4)

试试这个,

$client->__soapCall('methodName',array('requestObj'=>$requestObj));