powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] SOAP(nuSOAP) как создать пакет с header ?
7 сообщений из 7, страница 1 из 1
[PHP] SOAP(nuSOAP) как создать пакет с header ?
    #38458060
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
работаю с сервисом SOAP, он с авторизацией - надо залогиниться, получить значение сессии, которое потом прикладывать к каждому запросу(конверту) SOAP.

Вот описание пакета авторизации:
POST Client.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "Logon"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" xmlns:soap=" http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Logon xmlns="Client">
<Login>string</Login>
<Password>string</Password>
</Logon>
</soap:Body>
</soap:Envelope>

Залогиниться у меня получается, вот запрос:
Код: php
1.
2.
3.
4.
require_once('lib/nusoap.php');

$client = new nusoap_client('http://localhost/Client.asmx?WSDL', 'wsdl');
$result = $client->call("Logon", array( "Login" => "Admin", "Password" => "12345" ));


создаётся конверт:
RequestPOST Client.asmx HTTP/1.0
Host: localhost
User-Agent: NuSOAP/0.9.5 (1.123)
Content-Type: text/xml; charset=ISO-8859-1
SOAPAction: "Client/Logon"
Content-Length: 558

<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns7786=" http://tempuri.org"><SOAP-ENV:Body><Logon xmlns="Client"><Login>Admin</Login><Password>12345</Password></Logon></SOAP-ENV:Body></SOAP-ENV:Envelope>


получаем ответ в котором всё ОК и есть нужный нам Session , через регулярные выражения запихнул его в переменную $Session и делаю следующий запрос:

Код: php
1.
$result = $client->call("GetUsers", array( "Session" => $Session ));



Но получаю Fault, и сформированный пакет просто не содержит сессию. Я подозреваю, что ошибка заключается в создании запроса, ибо вот описание пакета GetUsers:
POST Client.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "Client/GetUsers"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" xmlns:soap=" http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<SecurityHeader xmlns="Client">
<Session>session</Session>
</SecurityHeader>
</soap:Header>
<soap:Body>
<GetOperators xmlns="Client" />
</soap:Body>
</soap:Envelope>

Здесь session в блоке Header, а не в Body. Я подозреваю, что как то иначе надо передавать переменные туда, но вот как - не выходит вообще.
Хотя может вообще не в этом дело. Подскажите, пожалуйста как запрос создать.
...
Рейтинг: 0 / 0
[PHP] SOAP(nuSOAP) как создать пакет с header ?
    #38458821
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отчасти разобрался, перед вызовом GetUsers делаем отправку заголовков отдельной командой:
Код: php
1.
$client->setHeaders("<Session>$session</Session>");


а потом делаю:
Код: php
1.
$result = $client->call("GetUsers", array());



вижу что в сформированном пакете теперь есть header и в нём есть передаваемая сессия.

Но, к сожалению, всё равно что то не так....получаю ответ "Нет сессии авторизованного пользователя".

Есть у меня подозрение теперь, что надо как то вот так:
Код: php
1.
$client->setHeaders("<SecurityHeader xmlns=\"Client\"><Session>$session</Session></SecurityHeader>");



Ибо я в пакете-запросе не видел "SecurityHeader", там начинался блок header и сразу шла передача <Session> без <Security header

но проверить пока не могу :(
...
Рейтинг: 0 / 0
[PHP] SOAP(nuSOAP) как создать пакет с header ?
    #38458893
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
незнаю как в nusoap, в стандартной реализации имеются специальные объекты для генерации заголовков в тело конверта
http://us1.php.net/manual/ru/class.soapheader.php
экземпляры которого вставляются в сам запрос http://us1.php.net/manual/ru/soapclient.soapcall.php
в момент обращения конверт получается с заголовком.

Кроме данных в заголовке должны быть и служебные флаги, определение пространства имен и тд, все это есть в спецификации протокола.
Ели у вас имеется стандартное расширение SOAP, то наверное лучше перейти на него, тем более у подавляющего большинства хостеров это расширение имеется.
...
Рейтинг: 0 / 0
[PHP] SOAP(nuSOAP) как создать пакет с header ?
    #38458916
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sxq, у меня всё локально на Denwer.
Когда появилась задача работы с SOAP подключил php_soap.dll в php.ini, в phpinfo выдает что Soap подключен и всё ок.

Но я так и не смог через стандартный soap даже авторизоваться, а через nuSOAP пошло всё в лёт ;)

Если не получится добиться с nuSOAP то вернусь к стандартному и буду мучать уже его.
...
Рейтинг: 0 / 0
[PHP] SOAP(nuSOAP) как создать пакет с header ?
    #38458933
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для начала вам следует изучить спецификацию конверта (она может быть в 2-х версиях, хотя сам заголовок не сильно отличается), судя по всему ваш заголовок вне стандарта, поэтому и не работает.
например, <SecurityHeader xmlns="Client"> xmlns должен быть в виде URL, а не просто строка.
Вы якобы создаете параметр "<Session>$session</Session>", вы уверены что имя параметра Session? и он верно обрабатывается на стороне сервера? Скорее всего у вас пропущен в заголовке имя метода/функции которая должна обработать ваш заголовок.
Вы описали заголовок в теле конверта в описателе WSDL? (хотя это не влияет на работу)

Сам заголовок по сути тоже самое что и тело, там так же задаются имена функций/методов и параметры к ним, только он выделен в отдельный блок.

Стандартная реализация работает нормально, хотя имеются ошибки, но не критичные, и работать будет быстрее чем эмуляция написанная на самом PHP
...
Рейтинг: 0 / 0
[PHP] SOAP(nuSOAP) как создать пакет с header ?
    #38459961
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за ответы. У меня всё получилось.


Вот только теперь вопрос возник:
при выводе
Код: php
1.
print_r($result)


у меня все русские символы печатаются ???? (символами вопроса)

а вывожу Response вот так:
Код: php
1.
htmlspecialchars($client->response, ENT_QUOTES)



эти же русские символы выводятся кириллицей.

Пытался сделать вот так:
Код: php
1.
2.
3.
$client = new nusoap_client('http://localhost/Client.asmx?WSDL', 'wsdl');
$client->decode_utf8 = 0;
$client->soap_defencoding = 'UTF-8';



не помогло :(
как бы сделать что бы в массиве result тоже были русские символы?
...
Рейтинг: 0 / 0
[PHP] SOAP(nuSOAP) как создать пакет с header ?
    #38459986
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВСЁ! РЕШЕНО! на данный момент вопросов нет.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] SOAP(nuSOAP) как создать пакет с header ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]