Спокойный и МЫЛО

Как я могу реализовать как restful, так и SOAP вместе?


person Iguramu    schedule 25.08.2009    source источник
comment
Я бы порекомендовал теплую ванну :-)   -  person Nifle    schedule 25.08.2009
comment
Я оттуда :)   -  person Iguramu    schedule 25.08.2009


Ответы (6)


REST и SOAP — взаимоисключающие понятия. Вы не можете.

person aehlke    schedule 25.08.2009
comment
Вы не можете использовать REST на основе HTTP поверх SOAP, но вы можете определить новый унифицированный интерфейс, используя интерфейсы на основе SOAP. Ничто не мешает сообщениям SOAP быть гипермедиа. Единственное, в чем я не уверен, так это в том, как вписываются стандартные типы мультимедиа. Конверт SOAP может стать альтернативой заголовкам http для описания сообщения. К сожалению, я не думаю, что ОП на самом деле спрашивает, может ли он сделать RESTFul SOAP, я думаю, он спрашивает, может ли он выставить интерфейс, который одновременно является SOAPy и RESTful, что, я считаю, НЕТ. Однако WCF, похоже, считает по-другому. - person Darrel Miller; 25.08.2009

Вы не можете реализовать единый API, который соответствует REST и SOAP.

Однако можно создать систему, которая предоставляет RESTful API и SOAP API с эквивалентной функциональностью.

Для этого базовая реализация системы должна быть независимой от обоих API. Если, например, вы реализовывали свою систему с помощью Java, базовая реализация и каждый API должны быть в независимых пакетах. Если Python, независимые модули. И Т. Д.

В идеале, если бы у вас было бесконечное время, каждый API был бы полностью спроектирован так, чтобы соответствовать базовым парадигмам их архитектурных стилей: API RESTful был бы правильно ориентирован на ресурсы и передачу представлений их состояния, а API SOAP был бы правильно ориентирован. вокруг процедур и их параметров и возвращаемых значений.

Однако, чтобы сэкономить время, можно смоделировать SOAP API после REST API, просто объединив имена ресурсов с методами HTTP. В результате получается своего рода гибрид REST-через-SOAP.

Например, если в вашем REST API есть ресурс с именем Mailboxes, который поддерживает GET, POST, PUT и DELETE, а также принимает и возвращает представления типа application/json, вы можете смоделировать ресурс и его методы, создав следующие методы SOAP:

  • get_mailboxes(url, options) returns jsonDoc
  • post_mailboxes(url, options, jsonDoc) returns jsonDoc
  • put_mailboxes(url, options, jsonDoc) returns jsonDoc
  • delete_mailboxes(url, options) returns nothing

Прошу прощения, если мои обозначения неверны, я не очень хорошо знаком с SOAP.

person Avi Flax    schedule 28.08.2009

Вы можете предоставить ту же службу как на основе SOAP, так и на основе RESTful. Axis2 с WSDL 2.0 поддерживает это.

Пожалуйста, ознакомьтесь с этой статьей Веб-сервисы RESTful с Apache Axis2 - подробно объясняется.

Спасибо..

person Prabath Siriwardena    schedule 28.08.2011

При наличии произвольной службы ничто не мешает вам открыть для нее интерфейсы REST и SOAP. Однако характер услуги может подходить для одного метода доступа больше, чем для другого.

person Andy    schedule 27.08.2009

Сделайте свой Soap Service первым со всеми вашими аннотациями метаданных Убедитесь, что у вас есть wsdlLocation внутри вашего @webserivce

Затем вы можете добавить все свои остальные аннотации и остальные классы. Это будет работать в том же делегате.

person Kevin    schedule 13.05.2014

В принципе, вы можете пойти с этим подходом. На самом деле у меня это уже реализовано в php с использованием Zend Framework.

Вы можете создать класс, содержащий все функции API, которые вы хотите открыть через rest или soap. И затем вы можете создать php-скрипт, который захватит запрос и на основе параметра, отправленного клиентом, обработает запрос и отправит его в службу мыла или отдыха. Взгляните на этот код.

у меня есть эта функция, чтобы проверить параметр, поступающий от клиента, если это отдых, то отправить запрос в службу отдыха, иначе, если это параметр - мыло, то отправить запрос в службу мыла, но обратите внимание, что Zend_Rest_Server и Классы Zend_Soap_Server настроены на использование одного и того же класса ($controllerClassName) для обработки запроса.

Таким образом, одна и та же API (функциональность) раскрывается с помощью остальных и мыла.

public function dispatch()
{

    $this->preDispatch();

    $include_file_path = sprintf(APPLICATION_PATH . "/modules/%s/controllers/%s.php", ucfirst($this->request->getModuleName()), ucfirst($this->request->getControllerName()));
    require_once $include_file_path;

    $controllerClassName = sprintf("%s_Controller", ucfirst($this->request->getControllerName()));

    switch (strtolower($this->request->getServiceType())) {
        case self::REST_SERVICE:
            $r = $this->getRequest();
            $server = new Rest_Server();
            $server->setClass($controllerClassName);
            $server->handleRequest($this->request);

            break;

        case self::SOAP_SERVICE:

            if (array_key_exists('wsdl', $this->getRequest()->getQuery()) || array_key_exists('WSDL', $this->getRequest()->getQuery())) {

                $auto = new Zend_Soap_AutoDiscover();
                $auto->setClass($controllerClassName);
                $auto->handle();
            } elseif (count($this->getRequest()->getQuery()) == 0) {

                $wsdl = sprintf('http://%s%s?wsdl', $this->getRequest()->getHttpHost(), $this->getRequest()->getPathInfo());

                $soapServer = new Soap_Server($wsdl);
                $soapServer->setClass($controllerClassName);
                $soapServer->handle();
            }

            break;

        default:
            break;
    }

    $this->postDispatch();
}
person slash28cu    schedule 01.10.2012