2017-07-24 61 views
14

我有現有的REST API,使用Django Rest Framework編寫,現在由於某些客戶端要求,我必須將其中的一些作爲SOAP Web服務公開。編寫一個封裝來將現有的REST API作爲SOAP Web服務公開?

我想知道如何去在Python寫的包裝,這樣我可以公開一些自己的REST API作爲SOAP Web服務的。或者我應該單獨製作SOAP Web服務並重新使用代碼?

我知道這是一個奇怪的情況,但任何幫助,將不勝感激。

+0

還有呢?你準確的問題是什麼? –

+0

我想知道如何去寫一個包裝在Python中,以便我可以公開我的一些REST API作爲SOAP Web服務。或者我應該單獨製作SOAP Web服務並重新使用代碼? –

+0

那麼你有什麼嘗試? –

回答

9

你可以說,SOAPREST基本上是​​和oranges

你基本上需要的東西,在那裏你可以消耗REST API的。

依我之見,你有一些選擇:

  • 使用SOAP服務單獨另一個端口(端點)上運行。爲此,我會說,使用框架的喜歡通過HttpRPC
  • 通過WSGI或SOAP Spyne退房樣品hello world
  • 使用客戶首選的方式,無論是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的配置使其available

0

讓我們討論兩個途徑及其利弊

單獨的SOAP服務

  • 重複使用相同的代碼 - i如果您確定代碼更改不會影響兩個代碼流,那麼很好。如果你確信新功能的擴展不會影響其他部分是比較好的辦法去 - 特色的
  • 擴展。
  • Scalablity - 如果新的API相同應用程序的一部分,你確定它會伸縮帶更多的負荷,再次是一個不錯的選擇。
  • 擴展 - 如果你確信在未來增加更多的API不會創建的代碼一塌糊塗,這是再好去。

SOAP包裝使用Python(我favourate和建議的路要走)

  • 分離 - 關注與此你可以肯定的是,你寫什麼都代碼是從主邏輯sperate和你可以輕鬆插入並插入新的東西。

在這種情況下回答所有上述問題是。

您的來電,

評論和critisicsm是最歡迎的

+0

投票前請讓我知道原因 –

+0

再次閱讀問題 – maszynka

+0

@maszynka感謝您指出。 –