【问题标题】:PHP-Soap pass method parametersPHP-Soap 传递方法参数
【发布时间】:2009-05-01 03:24:01
【问题描述】:

我相对没有 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(单个变量、数组、类对象),我都无法获得具有那样结构的请求。

谁能帮帮我?我敢肯定它会很简单。

【问题讨论】:

    标签: php soap


    【解决方案1】:

    今天在处理一个稍微相关的问题时,我发现下面的 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);
    

    【讨论】:

    • 很抱歉评论了一个旧线程,但是在进行函数调用时将$params 转换为数组对我有用。谢谢本。
    • 实际上你可以只传递一个数组数组:array($params),它的工作原理是一样的。
    • 你现在救了我的命 Ben Gribaudo :) $sc->FuncName(array("param" => "value)) 正在按预期传递参数,但是 $sc->__soapCall("FuncName" , array("param" => "value") 没有传递任何参数。将参数放入 array("parameters" => $parameters) 就可以了。非常感谢老兄。
    【解决方案2】:

    试试这个:

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

    这对我来说适用于 .NET 网络服务。

    【讨论】:

      【解决方案3】:
      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 时效果不一样“发生未知错误!”来自 iframe 中的 .net asp Web 服务。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。

        这个为我解决了:

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

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

        【讨论】:

          【解决方案5】:

          试试这个,

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-19
            • 1970-01-01
            • 1970-01-01
            • 2012-10-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多