2017-07-24 34 views
14

Tôi có các API REST hiện có, được viết bằng cách sử dụng khung Django Rest và bây giờ do một số yêu cầu của khách hàng, tôi phải trưng ra một số trong số chúng như các dịch vụ web SOAP.Viết trình bao bọc để hiển thị các API REST hiện có dưới dạng các dịch vụ web SOAP?

Tôi muốn biết cách viết về trình bao bọc trong python để tôi có thể trưng ra một số API REST của tôi dưới dạng dịch vụ web SOAP. HOẶC tôi có nên tạo các dịch vụ web SOAP một cách riêng biệt và sử dụng lại mã không?

Tôi biết đây là một tình huống kỳ lạ nhưng mọi trợ giúp sẽ được đánh giá cao.

+0

Và? Câu hỏi của bạn là gì? –

+0

Tôi muốn biết cách viết về một trình bao bọc trong python để tôi có thể trưng ra một số API REST của tôi như các dịch vụ web SOAP. HOẶC tôi có nên tạo các dịch vụ web SOAP một cách riêng biệt và sử dụng lại mã không? –

+0

Bạn đã thử những gì? –

Trả lời

9

Bạn có thể nói, SOAPREST về cơ bản là applesoranges.

Về cơ bản, bạn cần một thứ gì đó, nơi bạn có thể sử dụng API REST.

Như tôi thấy, bạn có một số lựa chọn:

  • Sử dụng dịch vụ SOAP riêng chạy trên một cổng (endpoint). Cho rằng tôi sẽ nói, sử dụng khuôn khổ của như Spyne kiểm tra ra mẫu hello world
  • Sử dụng các khách hàng ưa thích bằng cách nào, hoặc SOAP qua WSGI hay SOAP qua HttpRPC
  • Gọi các điểm cuối REST API cùng mà bạn đã tạo thông qua các phương pháp trong SOAP. Chúng tôi đã sử dụng một wrapper api nội bộ trong một trong những ứng dụng, đó là như sau:
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)

Làm thế nào bạn có thể sử dụng điều này?

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

Hiện nay có một số ví dụ mà bạn có thể nhìn vào, là cấu hình Django để làm cho nó available

0

Lets Thảo luận về cả hai phương pháp tiếp cận và ưu và nhược điểm

riêng biệt SOAP Dịch vụ

  • Sử dụng lại cùng mã - i f bạn chắc chắn rằng những thay đổi mã sẽ không ảnh hưởng đến hai dòng mã, nó là tốt để đi.
  • Mở rộng đối tượng địa lý - nếu bạn chắc chắn rằng tiện ích mở rộng đối tượng địa lý mới sẽ không ảnh hưởng đến các phần khác thì tốt nhất là nên đi lại.
  • Scalablity - nếu API mới là một phần của cùng một ứng dụng và bạn chắc chắn rằng nó sẽ có thể mở rộng với tải nhiều hơn, nó lại là một lựa chọn tốt.
  • Tiện ích mở rộng - nếu bạn chắc chắn trong tương lai, thêm nhiều API sẽ không tạo ra một mớ hỗn độn mã, nó sẽ rất tốt để tiếp tục.

Xà phòng Wrapper Sử dụng Python (favourate của tôi và đề nghị con đường để đi)

  • tách cần quan tâm với điều này bạn có thể chắc chắn rằng, những gì từng mã bạn viết là sperate từ logic chính và bạn có thể dễ dàng cắm và cắm những thứ mới.

Trả lời cho tất cả câu hỏi trên trong trường hợp này là CÓ.

Your Call

Comments và critisicsm đang chào đón nhất

+0

Trước khi bỏ phiếu xuống, vui lòng cho tôi biết lý do –

+0

đọc lại câu hỏi – maszynka

+0

@ maszynka cảm ơn vì đã chỉ ra. –

Các vấn đề liên quan