2009-08-25 47 views
3

如何将restful和SOAP一起实现?Restful和SOAP

+28

我推荐一个温暖的浴:-) – Nifle 2009-08-25 08:57:49

+0

我来自那里:) – Iguramu 2009-08-25 09:05:17

回答

0

REST和SOAP是相互排斥的概念。你不能。

+2

你不能做基于HTTP的基于SOAP的REST,但你可以使用基于SOAP的接口定义一个新的统一接口。没有什么能阻止SOAP消息被超媒体化。我不确定的唯一部分是标准媒体类型是如何适应的。SOAP信封可以成为用于描述消息的http头的替代方案。 不幸的是,我不认为OP是真的在问他能不能做RESTFul SOAP,我想他是问他是否可以同时暴露SOAPy和RESTful的接口,我相信这不是。虽然WCF似乎有所不同。 – 2009-08-25 14:31:05

1

给定一个任意服务,没有任何东西阻止你公开REST和SOAP接口。但是,服务的性质可能比其他服务更适合一种访问方式。

12

您无法实现符合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。

+0

+1这是正确的答案。 – HDave 2011-11-16 21:56:23

0

基本上你可以用这种方法去。其实我已经在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(); 
} 
1

先为您的SOAP服务与您的所有元数据标注 确保你有你的里面的@webserivce一个wsdlLocation

然后,您可以将您的所有其余的注释和休息类 这将工作中相同的代表