用PHP构造Soap请求

时间:2011-05-12 23:51:59

标签: php soap

soap的新手,我使用soapUI(http://www.soapui.org)来测试我需要访问的服务,并确定我需要soap请求看起来像这样:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_5=mynamespace>
  <soapenv:Header/>
  <soapenv:Body>
    <_5:GetStaff>
      <_5:Request>
        <_5:SourceCredentials>
          <_5:SourceName>name</_5:SourceName>
          <_5:Password>pword</_5:Password>
          <_5:SiteIDs>
            <_5:int>num</_5:int>
          </_5:SiteIDs>
        </_5:SourceCredentials>
      </_5:Request>
    </_5:GetStaff>
  </soapenv:Body>
</soapenv:Envelope>

其中mynamespace,name,pword和num都是占位符。我只需要在PHP中构造这个请求。这是我最近的尝试:

<html>
<body>

<?php
require_once('nusoap.php');

$wsdl = ...;
$client = new SoapClient($wsdl);

/*
echo("\nDumping client object:\n");
var_dump($client);

echo("\nDumping client object functions:\n");
var_dump($client->__getFunctions());
*/

try {
  $credentials = new SoapVar(array(
                                   'SourceName'=>name,
                                   'Password'=>pword,
                                   'SiteIDs'=>num
                                  ),
                             SOAP_ENC_OBJECT,
                             type1,
                             mynamespace
                         );
  $request = new SoapVar(array('SourceCredentials'=>$credentials),
                         SOAP_ENC_OBJECT,
                         type2,
                         mynamespace
                        );
  $result = $client->GetStaff(new SoapParam($request, "Request"));
  echo $result;
}
catch (SoapFault $fault) {
  trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}

print "<pre>\n";
print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
print "</pre>";

?>

</body>
</html>

请相信,type1是SourceCredentials标记的合适类型,而type2是Request标记的适当类型。

当我在浏览器中打开此文件时,绝对没有显示任何内容。当注释行被取消注释时,我可以看到对象的转储(虽然我不知道如何解释转储),但是不显示对象函数。

这听起来好像SoapClient本身设置不正确,还是肥皂调用参数构造中的错误?

*澄清:我已将此文件命名为“index.php”,并在浏览器中导航到该文件所在的目录(它是我{{1}的子目录}目录)。

转储客户端对象:public_html

2 个答案:

答案 0 :(得分:1)

这最终成了配置问题;我正在使用的服务器上的php配置没有启用soap。此外,我没有服务器的管理员权限,因此很难确定这是原因,然后无法修复。

我必须将自己的机器设置为服务器,现在我能够成功设置SoapClient。

如果其他人经历了类似的事情并且需要做同样的事情,我找到了一个关于如何在PHP机器上使用PHP和MySQL设置Apache服务器的好教程:http://www.overclockers.com/forums/showthread.php?t=272080

答案 1 :(得分:0)

像这样构建您的SoapClient:

$client = new SoapClient($wsdl, array('trace' => 1,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE));

您需要跟踪选项才能看到__getLastRequest()

的输出