2009-07-23 4 views
3

Я относительно новичок в Soap на «создании сервисной части», поэтому заранее заблаговременно предлагаю любую терминологию, которую я собираю.Возвращение массива PHP из PHP SoapServer

Возможно ли вернуть массив PHP из службы обработки удаленных процедур, которая была настроена с использованием класса SoapServer класса PHP?

У меня есть WSDL (встроенный, слепо следуя учебник), что, в частности, выглядит примерно так

<message name='genericString'> 
    <part name='Result' type='xsd:string'/> 
</message> 

<message name='genericObject'> 
    <part name='Result' type='xsd:object'/> 
</message> 

<portType name='FtaPortType'>  
    <operation name='query'> 
     <input message='tns:genericString'/> 
     <output message='tns:genericObject'/> 
    </operation>   
</portType> 

Метод PHP Я звоню с именем запроса, и выглядит что-то вроде этого

public function query($arg){ 
    $object = new stdClass(); 
    $object->testing = $arg; 
    return $object;  
} 

Это позволяет мне позвонить

$client = new SoapClient("http://example.com/my.wsdl"); 
$result = $client->query('This is a test'); 

и дамп результат будет выглядеть примерно так

object(stdClass)[2] 
    public 'result' => string 'This is a test' (length=18) 

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

public function query($arg) { 
    $object = array('test','again'); 
    return $object; 
} 

Он сериализуется в объект со стороны клиента.

object(stdClass)[2] 
    public 'item' => 
     array 
      0 => string 'test' (length=4) 
      1 => string 'again' (length=5) 

Это имеет смысл, так как я имею конкретный xsd:object как тип результата в моем WSDL. Я бы хотел, если возможно, вернуть собственный PHP-массив, который не был завершен в Object. Мои инстинкты говорят, что есть определенный тип xsd:, который позволит мне выполнить это, но я не знаю. Я также соглашусь на то, что объект сериализуется как ArrayObject.

Не сдерживайте учебу меня в технических подробностях os WSDL. Я пытаюсь понять основные концепции fo

ответ

2

Я использовал this WSDL generator для создания файла описания.

Возвращаясь массив строк является то, что делает мой веб-сервис, вот часть WSDL:

<wsdl:types> 
<xsd:schema targetNamespace="http://schema.example.com"> 
    <xsd:complexType name="stringArray"> 
    <xsd:complexContent> 
     <xsd:restriction base="SOAP-ENC:Array"> 
     <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" /> 
     </xsd:restriction> 
    </xsd:complexContent> 
    </xsd:complexType> 
</xsd:schema> 

</wsdl:types> 
<message name="notifyRequest"> 
    <part name="parameters" type="xsd:string" /> 
</message> 
<message name="notifyResponse"> 
    <part name="notifyReturn" type="tns:stringArray" /> 
</message> 

Тогда функция API notify определяется:

<wsdl:operation name="notify"> 
    <wsdl:input message="tns:notifyRequest" /> 
    <wsdl:output message="tns:notifyResponse" /> 
</wsdl:operation> 
0

Алан, почему бы не передать свой объект в виде массива, когда ваш клиент получает ответ?

например.

(array) $object; 

Это превратит ваш StdClass объект в массив, нет измеримой над головой к этому, и O (1) в PHP.

Возможно, вы захотите изменить тип с xsd: object на soap-enc: Array.

+1

Две причины.Поскольку это даст мне массив с одним ключом с именем «элемент», который содержит мой массив, и, что более важно, я хочу создать службу, которую конечные пользователи могут использовать, и получить массив обратно без необходимости его запускать. –

+0

И soap-enc: Array не подходит для ваших нужд? – hobodave

+3

Имейте в виду, что это не рекурсивно конвертируется. Поэтому, если у вас есть объект stdClass на более глубоких уровнях вашего ответа, они не будут преобразованы. В этом случае единственный способ, о котором я могу думать, - это ответ Лубос. – flu

5

Маленькая хитрость - закодировать как объекты JSON, декодировать обратно в рекурсивные ассоциативные массивы:

$data = json_decode(json_encode($data), true); 
+0

Уже знал об этом, но вы напомнили мне в нужном месте! Благодаря :-) – Forbesmyester

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