2009-12-14 6 views
4

Учитывая, что следующий client.php создает этот запрос XML:Получение имен параметров из запроса SOAP с расширением PHP SOAP?

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://soap.dev/" 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/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
    <ns1:Test> 
     <RequestId xsi:type="xsd:int">1</RequestId> 
     <PartnerId xsi:type="xsd:int">99</PartnerId> 
    </ns1:Test> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Как получить доступ к именам параметров? (RequestId и PartnerId) внутри server.php? Имена явно там в полезной нагрузке, но на стороне сервера принимаются только значения (1 и 99)

Пример кода следующим образом:

client.php

<?php 
$client_params = array(
    'location' => 'http://soap.dev/server.php', 
    'uri' => 'http://soap.dev/', 
    'trace' => 1 
); 

$client = new SoapClient(null, $client_params); 

try { 
    $res = $client->Test(
     new SoapParam(1, 'RequestId'), 
     new SoapParam(99, 'PartnerId') 
    ); 

} catch (Exception $Ex) { 
    print $Ex->getMessage(); 
} 

var_dump($client->__getLastRequest()); 
var_dump($client->__getLastResponse()); 

server.php

class receiver { 
    public function __call ($name, $params) 
    { 
     $args = func_get_args(); 
     // here $params equals to array(1, 99) 
     // I want the names as well. 
     return var_export($args, 1); 
    } 

} 

$server_options = array('uri' => 'http://soap.dev/'); 
$server = new SoapServer(null, $server_options); 
$server->setClass('receiver'); 
$server->handle(); 

Обратите внимание: я не могу изменить формат входящих запросов.

Кроме того, я знаю, что я мог бы вернуть имена параметров, создав тестовую функцию с параметрами $RequestId и $PartnerId.

Но я действительно хочу, чтобы получить пары имя/значение из входящего запроса.

Пока что единственная идея, которую я имею, - просто проанализировать XML, и это не может быть прав.

ответ

1

Назад, когда у меня возникла эта проблема, я, наконец, решил пойти с идеей прокси-функции - проверить функцию с параметрами с именем ($ RequestId и $ PartnerId), чтобы вернуть имена параметрам. Его адекватное решение, но, конечно, не самое лучшее.

Я еще не потерял надежды найти лучшее решение, хотя, и вот моя лучшая идея до сих пор

<?php 
class Receiver { 

    private $data; 

    public function Test() 
    { 
     return var_export($this->data, 1); 
    } 

    public function int ($xml) 
    { 
     // receives the following string 
     // <PartnerId xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:int">99</PartnerId> 
     $element = simplexml_load_string($xml); 
     $this->data[$element->getName()] = (string)$element; 
    } 

} 

$Receiver = new Receiver(); 

$int = array( 
    'type_name' => 'int' 
    , 'type_ns' => 'http://www.w3.org/2001/XMLSchema' 
    , 'from_xml' => array($Receiver, 'int') 
); 


$server_options = array('uri' => 'http://www.w3.org/2001/XMLSchema', 'typemap' => array($int), 'actor' => 'http://www.w3.org/2001/XMLSchema'); 
$server = new SoapServer(null, $server_options); 
$server->setObject($Receiver); 
$server->handle(); 

Он по-прежнему означает разбор XML вручную, но один элемент в то время, который немного более разумно, что синтаксический анализ всего входящего сообщения SOAP.

Смежные вопросы