从NuSoap切换到PHP5肥皂 - 需要一个快速启动

时间:2010-09-21 16:35:07

标签: php soap nusoap

这是我正在努力的电话:

<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->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>

1 个答案:

答案 0 :(得分:2)

您是否尝试过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类,请尝试切换跟踪以查看正在发送和接收的内容。