【问题标题】:Switching from NuSoap to PHP5 Soap - need a jumpstart从 NuSoap 切换到 PHP5 Soap - 需要一个快速启动
【发布时间】:2012-12-24 06:38:07
【问题描述】:

这是我要打的电话:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <urn:SessionHeader  xmlns:urn="http://www.mywebservice.com/webservices/SoapService" xmlns="http://www.mywebservice.com/webservices/SoapService" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <urn:sessionId xmlns:urn="http://www.mywebservice.com/webservices/SoapService">LOGINTOKEN=your instance name</urn:sessionId>
    </urn:SessionHeader>
</soap:Header>
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <ns2:login xmlns:ns2="http://www.mywebservice.com/webservices/SoapService">
        <wsUser>
            <entityId>0</entityId>
            <password>your password</password>
            <username>your username</username>
        </wsUser>
    </ns2:login>
</soap:Body>

但我无法找出如何在 PHP5 的 Soap 中设置自定义标头。使用 nuSoap,我可以将整个内容放入一个变量中,然后使用$client-&gt;setHeader($headerVar),但我在 PHP 中找不到类似的东西。如果我能复制这个电话,我就能解决剩下的问题。任何帮助将不胜感激!

提前致谢!

更新:我一个接一个地完成了教程,阅读了 PHP 文档,但似乎没有任何效果。我可以用 curl(以及 nuSoap)做我想做的事,但我认为原生 PHP5 Soap 会更容易并且可能更稳定。估计不是……

更新 2 这是我正在尝试的代码:

$soapurl = 'http://www.mywebservice.com/webservices/SoapService?wsdl';
$client = new SoapClient($soapurl,array('trace'=>true));
$token = "LOGINTOKEN=your instance name";

$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token));
$client->__setSoapHeaders($header);


$client->login(array("wsUser" => array('entityId'=>'0','username'=>'my username','password'=>'my password')));

我得到的错误是:

**Fatal error**: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header in C:\www\soap\index.php:12 Stack trace: #0 C:\www\soap\index.php(12): SoapClient->__call('login', Array) #1 C:\www\soap\index.php(12): SoapClient->login(Array) #2 {main} thrown in C:\www\soap\index.php on line 12

更新 3 所以看起来“sessionId”作为“key”发送,令牌作为“value”发送。

 *REQUEST*:
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.mywebservice.com/webservices/SoapService">
<SOAP-ENV:Header>
<ns1:SessionHeader><item><key>sessionId</key><value>LOGINTOKEN=my token</value></item>
</ns1:SessionHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body><ns1:login><wsUser><entityId>0</entityId><password>my password</password><username>my username</username></wsUser></ns1:login></SOAP-ENV:Body></SOAP-ENV:Envelope>

【问题讨论】:

  • SoapClient::__setSoapHeaders() 没有做你想做的事? php.net/soapclient.setsoapheaders
  • 它可能,我已经尝试过实现它,但我不知道如何让它返回那个确切的格式。

标签: php soap nusoap


【解决方案1】:

您是否尝试过 SoapHeader 类来构建您的标题?像这样的东西有用吗?

//Assume $token holds your login token and $client holds the SoapClient object
$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token));
$client->__setSoapHeaders($header);

这应该创建标题并将其添加到 SoapClient。然后,使用 SoapClient 的每个后续调用都将设置该标头。至于确切的格式,我不会太担心。您的示例 XML 使用名为 urn 的命名空间的别名。 PHP 可能不会得到完全相同的别名,但它应该仍然可以工作。此外,我认为不需要在每个子元素中声明 xmlns。我认为子节点会自动继承其父节点在 XML 中的命名空间,但我对此不是 100% 确定的。最重要的是,只要在命名空间中声明了正确的 URL,即使 XML 与您的示例不完全匹配,它也应该没问题。

您可以尝试的另一件事是您是否在 SoapClient 中打开了跟踪?这是可以传递给构造函数的参数之一,它使您能够查看 XML SOAP 请求和响应。如果使用 SoapHeader 类仍然无法正常工作,请尝试打开跟踪以查看正在发送和接收的内容。

【讨论】:

  • 无法正常工作。我收到“未捕获的 SoapFault 异常”。有关更多信息,请参阅我的编辑...
  • 如果来自服务的 Soap 响应包含错误(soap 故障),则会引发 SoapFault。你能捕捉到异常并访问错误信息吗?它可能会给你一些关于正在发生的事情的有价值的信息。还可以尝试打开跟踪并转储正在发送和接收的 XML。完成后您能否回帖,我会看看我是否能想到任何其他建议。
  • 刚刚提交了对该问题的修改。感谢您的帮助。
  • 只看您的代码:您正在用实际的登录令牌值替换“LOGINTOKEN=您的实例名称”,不是吗?抱歉,这似乎是一个显而易见的问题。尝试将您的代码包装在 try{}catch{} 块中,以捕获引发的任何 Soap 错误。然后,您可以转储有关它们的信息。另外,您能否打开跟踪并发布作为 SOAP 请求发送的原始 XML?如果您打开跟踪,它应该在发送请求后在 SoapClient::__getLastRequest() 方法中可用。
  • 已更新。看来我找到了问题,只是不知道如何解决。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2011-06-14
  • 2022-12-15
相关资源
最近更新 更多