@EVOSandru6

Как правильно подрубить soapAction параметр в nusoap библиотеке на YII1 определенный action или метод класса?

Добрый день,

Такая беда, необходимо при формировании WSDL-ки правильно подрубить метод обработчика - action контроллера или метод класса (статический или обычный).

В структуре проекта есть модуль soap

В нем есть контроллер ManagersController

class ManagersController extends CController
{
    public function setData($name, $age, $sex)
    {
       // логика
    }
}

Также есть компонент SoapService, где я изначально хотел реализовать логику вместо ManagersController::setData() ( это было бы лучше, но как я понял - такой вариант не сработает )

Server:

header('Content-Type: text/xml; charset=utf-8');

        $this->soap_server->configureWSDL('setWebBox','webServer');
        $this->soap_server->decode_utf8 = false;
        $this->soap_server->soap_defencoding = 'UTF-8';

        $this->soap_server->wsdl->addComplexType(
            'ArrayOfString',
            'complexType',
            'array',
            '',
            'SOAP-ENC:Array',
            [],
            [
                ['ref'=>'SOAP-ENC:Array',
                    'wsdl:arrayType' => 'SOAP-ENC:string[]',
                    'arrayType' => 'SOAP-ENC:string[]',
                    'nillable'=>'true'
                ]
            ],
            'SOAP-ENC:string'
        );

       ...

        $this->soap_server->register(
            'setManager',
            [
                'name'=>'xsd:string',
                'age' => 'xsd:int',
                'sex' => 'xsd:string',
            ],
            [
                'code' => 'xsd:int',
                'message' => 'xsd:string'
            ],
            '',
            'uri:soap/managers/getData',
            'document',
            'literal'
        );

       ...

        // Подключаем обработчика запросов
        $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
        $this->soap_server->service($HTTP_RAW_POST_DATA);


1. Если я вместо этого варианта с register использую следующий:

$this->soap_server->register(
            'setManager',
            [
                'ID_1C' => 'xsd:int',
                'FIRST_NAME'=>'xsd:string',
                'LAST_NAME' => 'xsd:string',
                'THIRD_NAME' => 'xsd:string',
                'EMAIL' => 'xsd:string',
                'PARENT_BRANCH_ID' => 'xsd:int',
                'LESS_ONE_YEAR' => 'xsd:int'
            ],
            [
                'code' => 'xsd:int',
                'message' => 'xsd:string'
            ],
            '',
            '',
            'document',
            'literal'
        );


То если данный сервер находится не в контексте фреймворка, то успешно отрабатывает функция по названию метода - setManager

response:

Array ( [code] => 0 [message] => UPDATE OK )

2. Если я правильно понял, то для вызова методов в контексте фреймворка нужно поменять или название первого параметра в register либо 5-й параметр soapAction('uri:...')

Получается, что если я меняю soapAction, то вообще ничего не меняется, и функция (костыльный временный вариант) отрабатывается так же успешно.

Если же я меняю певый параметр в registry на 'soap/managers/ManagersController.setManager',
то во первых все ломается:

Array ( [faultcode] => SOAP-ENV:Client [faultactor] => [faultstring] => Operation 'setManager' is not defined in the WSDL for this service [detail] => )


Client:

public function nusoapClient()
    {
        header('Content-Type: text/html; charset=utf-8');
        // Создаем экземпляр клиента
        $client = new nusoap_client('http://tbox.a-i.kz/public/wbs/service.php/?wsdl');
        $client->setCredentials('Web_user','Umi@718293','basic');
        $params = [
            'id' => 199,
            'name' => 'RRRR',
            'sex' => 'aswe',
            'age' => 7,
        ];
        // Вызываем SOAP-метод
        $result = $client->call('setManager', $params);
        // Отображаем результат
        print_r($result);
        // Отображаем запрос и ответ
        echo '<h2>Запрос</h2>';
        echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
        echo '<h2>Ответ</h2>';
        echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
        die();
    }


Подскажите - как быть?
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы