Problem
–––-
Jest sobie spory System zbierający i udostępniający dane, napisany
prawie wyłącznie w C i C++. Istnieje do niego interfejs
programistyczny, również w postaci bibliotek C++, co jest bardzo fajne
ale mocno ogranicza możliwe zastosowania. Potrzebny jest interfejs
wykorzystujący protokół SOAP,
co pozwoli na wykorzystanie danych z Systemu w
programach napisanych w wielu innych językach programowania.
Założenia dodatkowe: rozwiązanie ma być jak najprostsze z punktu
widzenia użytkownika (programisty korzystającego z tego interfejsu),
administratora oraz samego autora. Oczywiście ważne są też pieniądze,
im mniej trzeba wydać na potrzebne do rozwiązania problemu biblioteki
tym lepiej.
Możliwości
–––––
Nasuwają się, z grubsza, trzy metody:
1. samodzielny serwer: napisać w C++ serwer udostępniający istniejący
interfejs za pośrednictwem
SOAP.
Podstawową zaletą jest prostota z punktu widzenia administratora:
nie jest potrzebne żadne dodatkowe oprogramowanie, a niezbędną
konfigurację można ograniczyć do podania portu, na którym serwer ma
działać.
Wada: sensowne biblioteki dla C++, zwłaszcza komunikacyjne,
pojawiają się rzadko i z dużym opóźnieniem, przy czym duża część z
nich jest albo droga, albo na
GPL.
A implementacja protokołu
SOAP na potrzeby
jednego projektu znacznie podnosi koszty.
2. moduł Apache (lub innego serwera www):
SOAP
do przesyłania
informacji wykorzystuje zwykle
HTTP,
więc logiczne wydaje się zrzucenie części
pracy na programy, które właśnie obsługą
HTTP
się zajmują.
Zaleta: możliwość skorzystania z dobrze przetestowanej platformy.
Wady: takie rozwiązanie jest zależne od dużego oprogramowania.
Instalacja i odpowiednia konfiguracja wszystkich potrzebnych
dodatków może być bardzo czasochłonna i pomyłkogenna. Serio:
[tak wygląda instalacja oprogramowania z Axis C++][axis_winstall],
pakietem do tworzenia WS
w oparciu o serwer Apache.
3. biblioteka dla PHP, Pythona lub Javy: w jak najprostszy sposób
udostępnić istniejące API do Systemu, najlepiej przy pomocy
SWIG,
jakiemuś językowi programowania z
wieloletnim i sprawdzonym wsparciem dla
WS.
Napisać faktyczny serwis już wykorzystując ten język.
Zaleta: dużą część pracy jest przeniesiona na język, w którym pisze
się (mi) znacznie łatwiej i szybciej. Można skorzystać z
istniejących, łatwo dostępnych bibliotek. Dodatkowo w wybranym
języku możnaby korzystać z danych zgromadzonych w Systemie nawet
bez korzystania z
SOAP
i powolnego przesyłania danych za
pośrednictwem sieci.
Wady: podobne z wadami rozwiązania #2 – wysoka złożoność oraz
zależności od dodatkowego oprogramowania.
Zdecydowanie najlepiej prezentuje się wariant pierwszy, pod warunkiem
znalezienia odpowiedniej biblioteki.
Rozwiązanie
–––––-
Wybór, zgodnie z przewidywaniami, wcale nie jest duży:
1. Axis C++
Wspomniana już biblioteka, niestety wymaga użycia serwera
Apache.
2. EasySoap
Zniechęca napis "NEW: Version 0.6 was released 12-april-2002" na
pierwszej stronie. W liście "easysoap-checkins" pojawiają się
informacje o nieco późniejszych zmianach, ale w śladowych
ilościach.
3. gSOAP
Zdecydowanie najlepsza biblioteka z całej listy. Jest aktywnie
rozwijana, [szybka][gsoap_perf] i ma dużą grupę użytkowników.
Licencja pozwala na bezpłatne korzystanie z większości
funkcjonalności w komercyjnych, zamkniętych programach.
4. SQLData SOAP Server
Niestety tylko pod Windows. Ta informacja z mojego punktu widzenia
całkowicie dyskwalifikuje bibliotekę.
5. [Systinet Server for C++][systinet]
Komercyjny. Płatny, na dodatek "our flexible licensing terms are
tailored to meet the deployment needs of your business model. [...]
To purchase our products or services, please contact us", co
tłumaczy się dość dosłownie na "pobieramy opłaty precyzyjnie dobrane
do naszej opinii na temat tego, jak wiele pieniędzy będziemy w
stanie wyciągnąć z Waszej firmy". Ta informacja z kolei przenosi
bibliotekę na szary koniec listy adresów do dokładniejszego
sprawdzenia.
6. White Mesa SOAP Service
Znowu tylko pod Windows. Czemu ludzie to robią?
7. XSoap
Projekt nie jest już rozwijany.
Tę listę zebrałem jakieś dwa tygodnie temu. Od tego czasu tworzę
serwis wykorzystując gSOAP, co okazało się świetnym rozwiązaniem.
Biblioteka jest wygodna, szybka i pozwala na maksymalne uproszczenie
instalacji: wynikiem mojej pracy jest pojedynczy plik wykonywalny.
Jedynym parametrem, poza opcjami potrzebnymi do korzystania z zasobów
wspomnianego na początku tekstu Systemu, jest numer portu na którym
serwis ma działać.
Ale to wystarczy na jeden wpis. Szczegóły w opisie drugiego etapu
[axis_winstall]: http://ws.apache.org/axis/cpp/wininstall-guide.html
[systinet]: http://www.systinet.com/products/ssc/overview
[soap]: http://www.w3.org/TR/soap/
[gsoap]: http://www.cs.fsu.edu/~engelen/soap.html
[gsoap_perf]: http://www.extreme.indiana.edu/xgws/papers/soap_perf_char_grid2004.pdf
[swig]: http://www.swig.org/