我已经有使用Django Rest Framework编写的REST API,现在由于某些客户端要求,我不得不将其中一些作为SOAP Web服务公开。

我想知道如何使用python编写包装器,以便将某些REST API公开为SOAP Web服务。还是应该单独制作SOAP Web服务并重用代码?

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

最佳答案

您可以说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)


如何使用呢?

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())


现在,您可以查看一些示例,这些示例是将其配置为available的Django配置

关于django - 写一个包装程序以将现有的REST API公开为SOAP Web服务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45279148/

10-16 13:00