PHP SOAP: Как я могу вернуть объекты из PHP, используя SOAP? - PullRequest
0 голосов
/ 17 июня 2009

Мне нужно отправлять / возвращать объекты или массив в / из PHP, используя SOAP. Есть хорошие ссылки?

Ответы [ 4 ]

2 голосов
/ 13 января 2012

Я использую Zend_Soap_Server и Zend_Soap_Client. Я отправляю / получаю массив сложной структуры.

Сначала создайте класс со структурой, которую вы хотите получить.

<?php

/**
 * Information about people
 */
class PeopleInformation
{
    /**
     * Name of ...
     *
     * @var string
     */
    public $name;

    /**
     * Age of
     * @var int
     */
    public $age;

    /**
     * Array of family
     *
     * @var FamilyInformation[]
     */
    public $family;
}

/**
 * Information about his family
 */
class FamilyInformation
{
    /**
     * Mother/sister/bro etc
     *
     * @var string
     */
    public $relation;

    /**
     * Name
     * @var string
     */
    public $name;
}

?>

Затем создайте сервис для получения этих данных:

<?php

/**
 * Service to receive SOAP data
 */
class SoapService
{
    /**
     *
     * @param PeopleInformation $data
     * @return string
     */
    public function getUserData($data)
    {
        //here $data is object of PeopleInformation class


        return "OK";
    }
}
?>

Теперь создайте экземпляр Zend_Soap_Server в контроллере по URL http://ourhost/soap/:

<?php

//disable wsdl caching
ini_set('soap.wsdl_cache_enabled', 0);
ini_set('soap.wsdl_cache', 0);

$wsdl = $_GET['wsdl'];

//this generate wsdl from our class SoapService
if (!is_null($wsdl))
{
    $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');
    $autodiscover->setClass('SoapService');
    $autodiscover->handle();
}
//handle all soap request
else
{
    $wsdlPath = 'http://ourhost/soap/?wsdl';

    $soap = new Zend_Soap_Server($wsdlPath, array(
        'cache_wsdl' => false
    ));
    $soap->registerFaultException('Zend_Soap_Server_Exception');
    $soap->setClass('SoapService');
    $soap->handle();
}

?>

И теперь вы получаете wsdl (http://ourhost/soap/?wsdl) с вашей структурой и обработкой запроса в SoapService :: getUserData . Входным параметром в этом методе является объект PeopleInformation class

1 голос
/ 08 октября 2010

В основном вам нужно создать карту классов и передать ее своему мыльному клиенту. Да, это боль. У меня обычно просто есть метод, который отображает имя объекта Soap на объекты PHP (т.е. Person => MY_Person) и кодирует только те, которые мне нужны, вручную (т.е. createdOn => DateTime).

class MY_WSHelper
{  
  protected static $ws_map;  
  public static function make_map()
  {
    if( ! self::$ws_map)
    {
      self::$ws_map = array();
      //These will be mapped dynamically
      self::$ws_map['Person'] = NULL;
      self::$ws_map['Animal'] = NULL;
      //Hard-coded type map
      self::$ws_map['createdOn'] = DateTime;
      self::$ws_map['modifiedOn'] = DateTime;

      foreach(self::$ws_map as $soap_name => $php_name)
      {
        if($php_name === NULL)
        {
          //Map un-mapped SoapObjects to PHP classes
          self::$ws_map[$soap_name] = "MY_" . ucfirst($soap_name);
        }
      }
    }
    return self::$ws_map;
  }
}

Клиент:

$client = new SoapClient('http://someurl.com/personservice?wsdl',
  array('classmap' => MY_WSHelper::make_map()));

$aperson = $client->getPerson(array('name' => 'Bob'));  
echo get_class($aperson); //MY_Person  
echo get_class($aperson->createdOn); //DateTime

http://php.net/manual/en/soapclient.soapclient.php

0 голосов
/ 24 июня 2013

Я переигрываю, чтобы поделиться своим (плохим) опытом.

Я создал веб-сервис с использованием PHP ZendFramework2 (ZF2).

Сервер отвечает объектам и массиву объектов, и пока он не принял строку в качестве входных данных, он работал хорошо. Я использовал стратегию ArrayOfTypeComplex .

$_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex();

Когда я пытаюсь использовать массив строк в качестве ввода, я чувствовал себя в темной и несчастной долине, пока не нашел ответ Рамиля, поэтому я меняю стратегию и все работает правильно!

$_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence();

if (isset($_GET['wsdl'])) {
    $autodiscover = new \Zend\Soap\AutoDiscover($_strategy);
    $autodiscover->setBindingStyle(array('style' => 'document'));
    $autodiscover->setOperationBodyStyle(array('use' => 'literal'));
    $autodiscover->setClass('Tracker\Queue\Service')
        ->setUri($_serverUrl);
    echo $autodiscover->toXml();
} 
0 голосов
/ 17 июня 2009

Папа Гугл указывает мне на эту Zend статью с множеством хороших примеров как клиентского, так и серверного аспектов работы с Soap (в частности, его реализации в PHP5). Выглядит как хорошая отправная точка.

Если вы чем-то похожи на меня, и вам не хватает мысли написать вручную WSDL, я бы порекомендовал использовать WSHelper , который использует классы отражения PHP для динамической генерации WSDL для вас. Определенно экономит время

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