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

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
EVOSandru6
Сообщения: 570
Зарегистрирован: 2014.07.04, 13:33

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

Сообщение EVOSandru6 » 2018.02.06, 13:35

Добрый день,

Такая беда, необходимо при формировании 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 (

Код: Выделить всё

 => 0 [message] => UPDATE OK )[/b]

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

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

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

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

[b]Client[/b]:

[code]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();
    }

Подскажите - как быть?

Ответить