Как я могу реализовать как restful, так и SOAP вместе?
Спокойный и МЫЛО
Ответы (6)
REST и SOAP — взаимоисключающие понятия. Вы не можете.
Вы не можете реализовать единый 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.
Вы можете предоставить ту же службу как на основе SOAP, так и на основе RESTful. Axis2 с WSDL 2.0 поддерживает это.
Пожалуйста, ознакомьтесь с этой статьей Веб-сервисы RESTful с Apache Axis2 - подробно объясняется.
Спасибо..
При наличии произвольной службы ничто не мешает вам открыть для нее интерфейсы REST и SOAP. Однако характер услуги может подходить для одного метода доступа больше, чем для другого.
Сделайте свой Soap Service первым со всеми вашими аннотациями метаданных Убедитесь, что у вас есть wsdlLocation внутри вашего @webserivce
Затем вы можете добавить все свои остальные аннотации и остальные классы. Это будет работать в том же делегате.
В принципе, вы можете пойти с этим подходом. На самом деле у меня это уже реализовано в 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();
}