WSDL и SOAP: возврат объекта с методами - PullRequest
3 голосов
/ 27 сентября 2011

Есть ли способ вернуть в мыло объект его методами?Если я возвращаю xsd: struct в WSDL, я получаю только свойства объекта, но не могу использовать ни один из методов.

Например,

class person
{
  var $name = "My name";
  public function getName()
  {
      return $this->name;
  }
}

Итак, после выборки объекта:

$client = new SoapClient();
$person = $client->getPerson();
echo $person->getName(); // Return "My Name";

Спасибо.

1 Ответ

3 голосов
/ 27 сентября 2011

Вы не можете сделать это с SOAP. По сути, ваш класс PHP отображается на структуру данных XML, которая определяется схемой XML. Это отображение включает только свойства и не может включать исполняемый код. SOAP предназначен для взаимодействия, и, естественно, вы не можете делиться кодом, скажем, с PHP и Java или .NET. На принимающей стороне ваша структура данных XML преобразуется в структуру данных языка программирования клиента (класс PHP, если вы используете SoapClient или класс C#, если вы используете C#). Поскольку структура данных XML содержит только информацию о свойствах, исполняемая часть исходного класса не может быть перестроена.

Но есть одна вещь, которая может помочь, если и сервер SOAP, и подключающийся клиент имеют доступ к одной и той же базе кода (что означает одинаковые классы). Вы можете определить отображение между типом XML и классом PHP в конструкторе SoapClient, используя опцию classmap. Это позволяет SoapClient отображать входящие структуры данных XML на реальные классы PHP - учитывая тот факт, что и сервер, и клиент имеют доступ к определению соответствующего класса. Это позволяет использовать методы на стороне приема сообщения SOAP.

class book {
    public $a = "a";
    public $b = "c";
    public function getName() {
        return $this->a.' '.$this->b;
    }
}

$options = array(
    'classmap' => array('book' => 'book')
);
$client = new SoapClient('path/to/wsdl', $options);
$book    = $client->test();
echo $book->getName();

WSDL может выглядеть так (скопировано с одного из SoapClient тестов и исправлено):

<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.nothing.com" targetNamespace="http://schemas.nothing.com">
    <wsdl:types>
        <xsd:schema targetNamespace="http://schemas.nothing.com">
            <xsd:complexType name="book">
                <xsd:all>
                    <xsd:element name="a" type="xsd:string"/>
                    <xsd:element name="b" type="xsd:string"/>
                </xsd:all>
            </xsd:complexType>
  </xsd:schema>
    </wsdl:types>
    <message name="testRequest">
    </message>
    <message name="testResponse">
        <part name="res" type="tns:book"/>
  </message>
    <portType name="testPortType">
        <operation name="test">
            <input message="tns:testRequest"/>
            <output message="tns:testResponse"/>
        </operation>
    </portType>
    <binding name="testBinding" type="tns:testPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="test">
            <soap:operation soapAction="http://localhost:81/test/interface.php?class=test/dotest" style="rpc"/>
            <input>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://schemas.nothing.com"/>
            </input>
            <output>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://schemas.nothing.com"/>
            </output>
        </operation>
    </binding>
    <service name="test">
        <port name="testPort" binding="tns:testBinding">
            <soap:address location="http://localhost:81/test/interface.php?class=test"/>
        </port>
    </service>
</wsdl:definitions>

Состояние SOAP в PHP может быть интересно, если вы делаете SOAP в PHP.

...