Переход с NuSoap на PHP5 Soap - нужен старт - PullRequest
3 голосов
/ 21 сентября 2010

Вот вызов, который я пытаюсь сделать:

<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" отправляется как "ключ", а токен - как "значение".

 *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 Ответ

2 голосов
/ 14 февраля 2011

Вы пробовали класс 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, попробуйте включить трассировку, чтобы увидеть, что отправляется и получается.

...