如何将restful和SOAP一起实现?Restful和SOAP
回答
REST和SOAP是相互排斥的概念。你不能。
你不能做基于HTTP的基于SOAP的REST,但你可以使用基于SOAP的接口定义一个新的统一接口。没有什么能阻止SOAP消息被超媒体化。我不确定的唯一部分是标准媒体类型是如何适应的。SOAP信封可以成为用于描述消息的http头的替代方案。 不幸的是,我不认为OP是真的在问他能不能做RESTFul SOAP,我想他是问他是否可以同时暴露SOAPy和RESTful的接口,我相信这不是。虽然WCF似乎有所不同。 – 2009-08-25 14:31:05
给定一个任意服务,没有任何东西阻止你公开REST和SOAP接口。但是,服务的性质可能比其他服务更适合一种访问方式。
您无法实现符合REST和SOAP的单一API。
但是,可以创建一个系统,该系统公开具有等效功能的RESTful API和SOAP API。
为了这样做,系统的底层实现应该独立于两个API。例如,如果您正在使用Java实现您的系统,则底层实现和每个API应该都是独立的包。如果Python,独立模块。等等
理想情况下,如果您有无限的时间,每个API都将被完全设计为符合其架构风格的基础范例:RESTful API将围绕资源和其状态表示的转换正确定位, SOAP API将围绕过程及其参数和返回值进行适当的定向。
但是,为了节省一些时间,通过简单地将资源名称与HTTP方法相结合,可以在REST API之后对SOAP API进行建模。结果是一种通过SOAP的混合REST。例如,如果您的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。
+1这是正确的答案。 – HDave 2011-11-16 21:56:23
您可以公开基于SOAP的相同服务以及RESTful。具有WSDL 2.0的Axis2支持这一点。
请参见本文RESTful Web Services with Apache Axis2 - 详细阐述了东西..
谢谢..
基本上你可以用这种方法去。其实我已经在PHP中使用zend框架已经实现。
您可以创建一个类,该类包含您想通过rest或soap显示的所有api函数。然后你可以创建一个php脚本来抓取请求,并根据客户端发送的参数来处理请求并将其发送给soap或rest服务。看看这个代码。
我有这个函数来检查一个参数来自客户端,如果它是休息,然后派遣请求到其余服务,否则,如果它的参数是肥皂然后派遣请求到肥皂服务,但注意到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();
}
先为您的SOAP服务与您的所有元数据标注 确保你有你的里面的@webserivce一个wsdlLocation
然后,您可以将您的所有其余的注释和休息类 这将工作中相同的代表
- 1. Java中的Restful和SOAP web服务
- 2. Web服务(基于SOAP/Restful)
- 3. iPhone处理xml vs soap vs JSON vs RESTful
- 4. Relay和Graphql RESTful?
- 5. CakePHP和RESTful webservices
- 6. RESTful服务和
- 7. Restful API和HTML
- 8. RESTful RAILS和Android HttpRequests
- 9. Android和RESTful服务
- 10. RESTful .NET和protobuf-net
- 11. HTTP 414 - RESTful和GET
- 12. WCF和REST和SOAP
- 13. WCF服务决定SOAP还是RESTful服务
- 14. Restful web服务如何比基于SOAP的web服务更好
- 15. 将FedEx SOAP WS与Spring Restful WS项目集成
- 16. SOAP与较低带宽(2G服务)上的RESTful性能问题
- 17. PHP5和SOAP/WSDL?
- 18. TouchJSON和SOAP
- 19. Python和SOAP
- 20. wget,webservice和SOAP
- 21. Kynetx和SOAP
- 22. SOAP和HTTP Post
- 23. implenting WSDL和SOAP
- 24. WinInet和SOAP
- 25. WinInet和SOAP
- 26. SOAP,XSL和HTML
- 27. jira SOAP和XMLRPC
- 28. AsyncTask和SOAP webservices
- 29. C++和SOAP
- 30. DocuSign Soap API和baseURL
我推荐一个温暖的浴:-) – Nifle 2009-08-25 08:57:49
我来自那里:) – Iguramu 2009-08-25 09:05:17