2011-10-12 26 views
57

Tôi hiện đang xem xét việc triển khai một ứng dụng khách sẽ sử dụng API quản lý SOAP mở rộng hiện có.Python SOAP Client - sử dụng SUDS hoặc cái gì khác?

Tôi đã xem xét các triển khai SOAP khác nhau như pysimplesoapSUDS. Trong khi lần đầu tiên có vấn đề phân tích cú pháp WSDL vì quá nhiều cuộc truy tìm, suds làm việc tốt (nhưng chậm) và tôi thực sự thích mô-đun. Tuy nhiên, có vẻ như có một số vấn đề với SUDS như mức tiêu thụ bộ nhớ cao, tốc độ phân tích WSDL và thiếu hỗ trợ cho một số thuộc tính WSDL (ví dụ: thuộc tính choice).
Mặc dù có rất nhiều người tích cực thực hiện các báo cáo lỗi và bản vá lỗi, đã có no release trong tổng số SUDS kể từ 0,4 vào 2010-09-15. Ngoài ra, wiki và lộ trình trông hơi bị bỏ quên.

Đối với tôi có vẻ như SUDS không còn được duy trì.

Vì vậy, đây câu hỏi của tôi:

  1. Nào thì nên để căn một dự án lớn hơn trên bọt như khách hàng xà phòng?
  2. Có một cái nĩa đã được thực hiện một số bản vá có sẵn trong hệ thống bán vé không?
  3. lựa chọn thay thế nào có sẵn, có một bộ nhớ thấp hơn và rất dễ sử dụng và có thể xử lý phức tạp file WSDL lớn

[Update tháng 11 năm 2013]

Hơn hai năm đã trôi qua và nó chỉ ra dự án suds ban đầu là thực sự chết. Không có thêm phiên bản nào kể từ năm 2010. Do thực tế này, rất nhiều người bắt đầu lừa đảo và phân phối như Debian đang triển khai các phiên bản vá của gói phần mềm gốc để sửa một số vấn đề.

Tôi có thể giới thiệu chiếc nĩa duy trì tích cực của Jurko mà tôi đã sử dụng thành công. Nó hỗ trợ python 3 và giải quyết rất nhiều vấn đề đã biết. Ghi chú phát hành và trình theo dõi lỗi có sẵn trên Bitbucket gói cũng có sẵn trên PyPI để nó có thể được cài đặt bằng pip.

+5

Wiki thay đổi nơi chủ yếu là về phiên bản 0.4 đã được phát hành vào năm 2010 (xây dựng số và nội dung tương tự). Trong 365 ngày qua có khoảng 11 cam kết của một cộng tác viên duy nhất, hầu hết trong số đó là các cập nhật rất nhỏ (1-2 loc). Không có cam kết nào dẫn đến bản phát hành mới – circus

+1

Chúng tôi có thể xác nhận nhận xét trên của [xiếc] (http://stackoverflow.com/users/593507/circus) ở trên: * không có bản phát hành mới từ [suds gốc] (https: // pypi.python.org/pypi/suds) từ năm 2010 *. Tuy nhiên [niekas] (http://stackoverflow.com/users/2609806/niekas) nhận thấy một ngã ba suds được duy trì: [suds-jurko] (https://bitbucket.org/jurko/suds/) ;-) – olibre

Trả lời

44

Trong khi có không phải là một tiêu chuẩn chứng nhận, nếu bạn phải sử dụng SOAP, Suds là lựa chọn tốt nhất của bạn. Các Sud có thể chậm trên các WSDL lớn và đó là điều mà chúng đang làm việc.

Trong khi đó, nếu bạn không mong đợi WSDL của bạn để thay đổi thường xuyên, bạn có hai lựa chọn có thể mua cho bạn rất nhiều tốc độ:

  1. Tải WSDL của bạn để localhost
  2. Sử dụng bộ nhớ đệm

Tải WSDL của bạn

với phần WSDLs lớn của vấn đề là đầu tiên bạn phải dow tải WSDL mỗi lần, có thể thêm phí.Suds sẽ dành thời gian tải xuống và phân tích toàn bộ WSDL khi khởi động để đảm bảo rằng nó không thay đổi.

Nếu bạn có thể tải xuống hệ thống cục bộ và sau đó chuyển nó tới hàm tạo Client bằng cách sử dụng sơ đồ file:// trong URL. Kể từ khi Sud sử dụng urllib2 cho việc vận chuyển HTTP, điều này là hoàn toàn hợp pháp.

Bây giờ, vì bạn không cung cấp tên máy chủ trong URL WSDL, bạn cũng sẽ phải chuyển đối số location chỉ định URL thực tế của ứng dụng SOAP.

Dưới đây là một ví dụ:

from suds.client import Client 

# The service URL 
soap_url = 'http://myapp.example.notreal/path/to/soap' 

# The WSDL URL, we wont' use this but just illustrating for example. This 
# would be the file you download to your system and save as wsdl_file 
wsdl_url = 'http://myapp.example.notreal/path/to/soap?wsdl' 

# The full path to the downloaded WSDL file on your local system 
wsdl_file = '/path/to/myapp.wsdl' 
wsdl_url = 'file://' + wsdl_file # Override original wsdl_url 

client = Client(url=wsdl_url, location=soap_url) 

Nếu bạn quan tâm, tôi đã sử dụng phương pháp này trong công việc của tôi và có open sourced the code.

Caching WSDL của bạn

Các tùy chọn khác là sử dụng bọt excellent caching feature. Bạn phải tạo một đối tượng bộ nhớ cache một cách rõ ràng và sau đó chuyển đối tượng đó tới hàm tạo bằng cách sử dụng đối số cache. Nếu không, giá trị mặc định là ObjectCache với thời lượng là 1 ngày.

Bạn cũng có thể xem xét sử dụng cả hai phương pháp này.

+0

Ok, tôi sẽ gắn với suds sau đó và sử dụng các phương pháp bạn ngụ ý. Ngoài ra tôi có lẽ sẽ kết thúc với một phiên bản vá của đinh tán, để giảm bớt dấu chân bộ nhớ. – circus

+0

Tôi mong được thấy kết quả cuối cùng nếu bạn chọn chia sẻ nó! :) – jathanism

6

Một thú up-to-date bài có thể được tìm thấy ở đây: What SOAP client libraries exist for Python, and where is the documentation for them? Thật không may, thư viện SOAP hoàn hảo bạn đang tìm kiếm dường như không tồn tại (chưa)

+0

I biết về chủ đề này, đây là cách tôi stumbled khi suds ở nơi đầu tiên. Dù sao cũng cảm ơn bạn. – circus

+0

Ngoài ra, tôi không tìm kiếm một thư viện hoàn hảo. Tôi chỉ cần quyết định nếu một cơ sở một dự án lớn hơn tôi sẽ được làm việc trong nửa năm tới trên suds. Và nếu tôi phải vá thư viện để nó hoạt động. – circus

5

Đó là năm 2013. Đây là bản cập nhật cho bất kỳ ai gặp sự cố với Python và SOAP như tôi.

Tôi đã cố gắng sử dụng SOAP bằng Python. Tôi cố gắng ra bọt, nhưng thật đáng buồn thư viện chưa được cập nhật kể từ năm 2010. Trong thời gian thử nghiệm đầu tiên của mã của tôi, tôi nhận được lỗi này:

RuntimeError: maximum recursion depth exceeded while calling a Python object 

Mà hóa ra là một vấn đề bọt có với sự tham khảo đệ quy trên các kết nối HTTPS. See drfence's answer. Tôi đã phải vá thủ công các bọt để vượt qua vấn đề đó.

Tôi đã chuyển sang dùng php. Không đơn giản như python, nhưng tôi đã có thể làm cho nó hoạt động.

+13

[suds-jurko] (https://bitbucket.org/jurko/suds/) được duy trì ở ngã ba SUDS. – niekas

+0

@niekas Cảm ơn. Tôi sẽ kiểm tra. – RobotNerd

+0

Tôi đã gặp vấn đề tương tự với độ sâu đệ quy tải WSDL của NetSuite. Bạn cần xây dựng nhà phát triển JURKO SUDS mới nhất và nó sẽ khắc phục vấn đề. (Thêm https trước URL bitbucket - không thể làm điều đó trong các nhận xét) sudo pip install bitbucket.org/jurko/suds/get/tip.tar.gz#egg=suds –

6

Có một khách hàng SOAP mới được duy trì tốt được gọi là zeep. Nó hỗ trợ cả Python 2 và 3 và dựa trên lxml cũng như yêu cầu các thư viện.

+0

Tôi không chắc mình sẽ sử dụng ' zeep' gây ra các ví dụ của họ trên trang đầu là thiếu sót; những ấn tượng đầu tiên. Cụ thể từ ví dụ nhanh (được lặp lại trong các ví dụ khác), việc nhập là 'từ zeep import Client'. Sau đó trên dòng 2 ('client = zeep.Client (') sẽ cung cấp cho bạn 'NameError: name 'zeep' không được định nghĩa'. – VertigoRay

+3

Vì nó là nguồn mở ... https://github.com/mvantellingen/python-zeep/pull/23 – VertigoRay

+2

Haha tôi sắp gửi PR với thay đổi đó. Bạn đánh tôi :) – chhantyal

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