繁体   English   中英

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

[英]Write a wrapper to expose existing REST APIs as SOAP web services?

我有现有的REST API,使用Django Rest Framework编写,现在由于一些客户端要求,我必须将其中一些暴露为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())

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

让我们讨论这些方法及其优缺点

单独的SOAP服务

  • 重用相同的代码 - 如果您确定代码更改不会影响两个代码流,那么最好去。
  • 扩展功能 - 如果您确定新功能扩展不会影响其他部分,那么最好再去。
  • Scalablity - 如果新API是同一个应用程序的一部分,并且您确信它可以通过更多负载进行扩展,那么它也是一个不错的选择。
  • 扩展 - 如果您确定将来添加更多的API不会产生一堆乱码,那么它也是一件好事。

使用Python的Soap Wrapper (我最喜欢和建议的方式去)

  • 关注问题 ,您可以确定,您编写的代码是从主逻辑中获取的,您可以轻松地插入并插入新内容。

如果是,则回答上述所有问题。

您的来电 ,

评论和批评是最受欢迎的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM