编写一个包装器以将现有REST API公开为SOAP Web服务?

Ank*_*rma 14 django rest soap python-3.x django-rest-framework

我有现有的REST API,使用Django Rest Framework编写,现在由于一些客户端需求,我必须将其中一些暴露为SOAP Web服务.

我想知道如何在python中编写包装器,以便我可以将一些REST API作为SOAP Web服务公开.或者我应该单独制作SOAP Web服务并重用代码?

我知道这是一个奇怪的情况,但任何帮助将不胜感激.

Nag*_*tri 9

你可以说,SOAPREST基本上是applesoranges.

你基本上需要一些东西,你可以使用REST API.

正如我所见,你有一些选择:

  • 使用另一个端口(端点)上单独运行的SOAP服务.为此,我会说,使用类似Spyne的框架查看示例hello world
  • 使用客户端首选方式,通过WSGI的SOAP或通过HttpRPC的 SOAP
  • 调用通过SOAP中的方法创建的相同REST API端点.我们在其中一个应用程序中使用了内部api包装器,如下所示:
def wrap_internal_api_call(requests_api_method, uri, 
                           data, cookies=None, headers=None):

    return requests_api_method(uri, data=data, files=files, 
               cookies=cookies, headers=headers)
Run Code Online (Sandbox Code Playgroud)

你怎么用这个?

import requests

from django.core.urlresolvers import reverse
from django.conf import settings

from spyne.service import Service
from spyne.decorator import srpc
from spyne.model import ByteArray, DateTime, Uuid, String, Integer, Integer8, \
    ComplexModel, Array


# This method will hit the internal API which is written in DJANGO REST FRAMEWORK
def build_internal_uri(uri):
  return 'http://localhost:{0}{1}'.format(settings.INTERNAL_API_PORT, uri)


class RequestHeader(ComplexModel):
  some_field = String


class SomeService(Service):
    # Headers related doc
    # https://github.com/arskom/spyne/blob/68b9d5feb71b169f07180aaecfbe843d8ba500bf/doc/source/manual/06_metadata.rst#protocol-headers 
    __in_header__ = RequestHeader

  @srpc(String, _returns=String)
  def echo_string(s):
    headers = ctx.in_header.some_field

    # Reverse url from the urls.py file
    local_order_fetch_url = build_internal_uri(reverse('website:order_details')) + '?order_id=' + order_id

    response = wrap_internal_api_call(requests.get, local_order_fetch_url, 
            { 'data': 'sample_data' }, None, headers)

    return response['data'] # Some string data


app = Application([SomeService], 'tns', in_protocol=HttpRpc(parse_cookie=True), 
                out_protocol=HttpRpc())
Run Code Online (Sandbox Code Playgroud)

现在有一些例子可供您查看,作为Django配置使其可用