Отдых и мыло - PullRequest
       17

Отдых и мыло

3 голосов
/ 25 августа 2009

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

Ответы [ 6 ]

12 голосов
/ 28 августа 2009

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

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

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

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

Однако, чтобы сэкономить время, можно моделировать API-интерфейс SOAP после API-интерфейса REST, просто комбинируя имена ресурсов с методами HTTP. В результате получается своего рода гибрид REST-via-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.

2 голосов
/ 28 августа 2011

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

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

Спасибо ..

1 голос
/ 14 мая 2014

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

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

1 голос
/ 27 августа 2009

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

1 голос
/ 25 августа 2009

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

0 голосов
/ 02 октября 2012

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

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

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

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

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();
}
...