Python i SOAP - jest nadzieja...

2009-09-24 od romanb python, soap

Z wielu źródeł słyszałem, że obsługa SOAP w Pythonie jest do bani, dlatego też odwlekałem przepięcie pewnego API z backendu PHP do Python jednakże co się odwlecze to nie uciecze i w końcu zmiany wprowadzić musiałem. SOAPpy odpadło jako pierwsze gdyż nie potrafiło sobie poradzić z typami zdefiniowanymi w WSDL - no ale czegóż się spodziewać po bibliotece której numer wersji zatrzymał się na 0.12.0_rc1 od 4 lat nie miała żadnej aktualizacji. Następne w kolejce było nieco świeższe ZSI, mówię nieco gdyż ostatnia wersja ZSI datowana jest na listopad 2007 roku. Radość - gdy ZSI poradziło sobie z zakodowaniem typu z WSDL i poprawnie sformatowało wychodzącą transmisję - nie trwała jednak długo. ZSI nie potrafiło poprawnie zinterpretować tego samego typu zawartego w odpowiedzi serwera.

W sumie po jakichś 6 godzinach spędzonych na próbach ustalenia miejsca błędu i zmuszenia biblioteki do poprawnej pracy, gdy moja rezygnacja sięgnęła dna pomyślałem: nie może być tak, że język tak dobrze wyposażony w biblioteki ma tak spapraną obsługę tej technologii. Zacząłem poszukiwania na nowo. Natknąłem się na wiele opinii typu "SOAP jest do bani jako taki i po co go chcesz implementować? lepiej zrób to w czym innym". Tak kochani developerzy, a co w przypadku gdy ty tylko korzystasz z dostępu do aplikacji za pomocą SOAP, nie masz żadnego wpływu na korporację która ci tą aplikację dostarcza i na pewno nie przekonasz ich, że te setki tysięcy które przeznaczyli na wdrożenie powinni wyłożyć jeszcze raz na zorganizowanie sobie alternatywy np w postaci XML-RPC tylko dlatego, że ja używam języka który nie ma porządnej biblioteki do SOAP. Tym bardziej, że obsługa tejże technologii nie stwarza PHP czy Railsom większych problemów, cała implementacja to przygotowanie danych a potem 2 linijki na komunikację z serwerem aplikacji.

I wtedy udało się. Na StackOverflow natknąłem się na człowieka z tym samym problemem któremu ktoś podpowiedział: użyj suds - to naprawdę działa. Postanowiłem spróbować i rzeczywiście. Biblioteka suds daje radę. Może nie zrywa bereciku ale naprawdę , w porządnym pythonowym stylu, daje radę! Dołączenie biblioteki, 2 linijki kodu i o dziwo: jest, działa, obsługuje zdefiniowane w WSDL typy i enumeracje, inspekcję usług i wymaganych typów przez proste print obiektu, unicode itp...

Więc jeśli ktoś z was też "wie", że SOAP w Pythonie jest beznadziejny to polecam suds.