<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag xmlrpc</title>
    <link>http://blog.zabiello.com/articles/tag/xmlrpc</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Python, SOAP, REST i Rails</title>
      <description>&lt;p&gt;Ostatnie problemy z pod&#322;&#261;czeniem si&#281; z poziomu Pythona do do web serwis&#243;w napisanych w C#/.NET zmusi&#322;y mnie do g&#322;&#281;bszego spojrzenia na kwesti&#281; promowanego przez Microsoft (i kiedy&#347; Macromedi&#281;&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;) tworzenia aplikacji za pomoc&#261; web serwis&#243;w i zwi&#261;zanego z nim protoko&#322;u &lt;span class="caps"&gt;SOAP&lt;/span&gt;. Mo&#380;e wpierw kr&#243;tko na&#347;wietl&#281; problem jaki napotka&#322;em w Pythonie.&lt;/p&gt;


	&lt;p&gt;Problem dotyczy&#322; konieczno&#347;ci po&#322;&#261;czenia si&#281; za pomoc&#261; Pythona z z dotnetowym web serwisem napisanym w C#. Wybrana biblioteka &lt;a href="http://pywebsvcs.sourceforge.net/"&gt;&lt;span class="caps"&gt;ZSI&lt;/span&gt;&lt;/a&gt; 2.0rc3 bezskutecznie pr&#243;bowa&#322;a zestawi&#263; po&#322;&#261;czenie:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="constant"&gt;ZSI&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ServiceProxy&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;ServiceProxy&lt;/span&gt; 
&lt;span class="ident"&gt;wsdl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;http://localhost/web/MyAction.asmx?wsdl&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; 
&lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="constant"&gt;ServiceProxy&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;wsdl&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;tracefile&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;sys&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stdout&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Mo&#380;na by&#322;o zobaczy&#263; dziwaczny b&#322;&#261;d:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_python "&gt;&amp;quot;C:\opt\Python25\lib\site-packages\zsi-2.0_rc3-py2.5.egg\ZSI\wstools\WSDLTools.py&amp;quot;,
line 1116, in getAddressBinding 
WSDLError: No address binding found in port. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Nawet gdybym chcia&#322;, to debugowanie &#378;r&#243;de&#322; biblioteki &lt;span class="caps"&gt;ZSI&lt;/span&gt; by&#322;oby raczej ma&#322;o por&#281;czne (ZSI zainstalowa&#322;a si&#281; w postaci jednego, binarnego pliku egg). Domy&#347;li&#322;em si&#281; &#380;e problemem jest chyba jaka&#347; r&#243;&#380;nica w microsoftowej implementacji &lt;span class="caps"&gt;SOAP&lt;/span&gt; bo ten sam kod bez problemu &#322;&#261;czy&#322; si&#281; z web serwisami Googli (kt&#243;rych raczej nie ma co podejrzewa&#263; &#380;e korzystaj&#261; z .NET) Co ciekawe, mog&#322;em bez problemu po&#322;&#261;czy&#263; si&#281; z tymi web serwisami .NET ale za pomoc&#261;&amp;#8230; Rubiego. By&#263; mo&#380;e to, &#380;e &lt;span class="caps"&gt;SOAP&lt;/span&gt; jest w&#322;&#261;czony do standardowej biblioteki Rubiego spowodowa&#322; &#380;e po prostu porz&#261;dnie kto&#347; t&#261; bibliotek&#281; napisa&#322; i przetestowa&#322;.&lt;/p&gt;


	&lt;p&gt;W przypadku Pythona istnieje wiele r&#243;&#380;nych, niezale&#380;nych bibliotek &lt;span class="caps"&gt;SOAP&lt;/span&gt;, &#380;adna nie zosta&#322;a w&#322;&#261;czona do biblioteki standardowej. Mo&#380;e w ko&#324;cu kto&#347; pomy&#347;li, &#380;e to wstyd aby biblioteki standardowe Python obs&#322;ugiwa&#322;y tylko &lt;span class="caps"&gt;XML&lt;/span&gt;-RPC. Bez wzgl&#281;du krytyk&#281; i wady &lt;span class="caps"&gt;SOAP&lt;/span&gt; jest propagowany przez kr&#281;gi Javy i .NET wi&#281;c troch&#281; g&#322;upio to tak ignorowa&#263;. Nawet &lt;span class="caps"&gt;PHP5&lt;/span&gt; doczeka&#322; si&#281; dobrej biblioteki &lt;span class="caps"&gt;SOAP&lt;/span&gt; w&#322;&#261;czonej do standardowych modu&#322;&#243;w. Musz&#281; wypr&#243;bowa&#263; jeszcze inne biblioteki, mo&#380;e kt&#243;ra&#347; &amp;#8220;ruszy&amp;#8221;. Pr&#243;bowa&#322;em zainstalowa&#263; &lt;a href="http://pywebsvcs.sourceforge.net"&gt;SOAPpy&lt;/a&gt;, ale wymaga&#322;a biblioteki fpconst, ta za&#347; nie ma przygotowanego pakietu egg dla Pythona 2.5. W ko&#324;cu do obszed&#322;em instaluj&#261;c pakiet za pomoc&#261; klasycznej mantry: python setup.py install.  &lt;del&gt;Jak SOAPpy nie zadzia&#322;a, to na li&#347;cie do sprawdzenia mam jeszcze &lt;a href="http://trac.optio.webfactional.com"&gt;soaplib&lt;/a&gt;.&lt;/del&gt; SOAPpy tu zadzia&#322;a&#322; ale wysypuje si&#281; w innym miejscu&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Pr&#243;buj&#261;c rozwi&#261;za&#263; problem dotar&#322;em dobardzo ciekawych tekst&#243;w polemiki &lt;span class="caps"&gt;SOAP&lt;/span&gt; vs &lt;span class="caps"&gt;REST&lt;/span&gt;. Chodzi mi o artyku&#322; &lt;a href="http://wanderingbarque.com/nonintersecting/2006/11/15/the-s-stands-for-simple/"&gt;The S stands for Simple&lt;/a&gt; oraz 3-cz&#281;&#347;ciowy (kolejne maj&#261; by&#263; napisane) &lt;a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/"&gt;The &lt;span class="caps"&gt;REST&lt;/span&gt; Dialogues&lt;/a&gt;.  Ten drugi to ciekawy dialog z fikcyjnym pracownikiem eBay (preferuj&#261;cym klasyczne podej&#347;cie z &lt;span class="caps"&gt;SOAP&lt;/span&gt; i udost&#281;pnianiem dziesi&#261;tek funkcji) ze zwolennikiem &lt;span class="caps"&gt;REST&lt;/span&gt;&amp;#8217;a.&lt;/p&gt;


	&lt;p&gt;Lektura tych tekst&#243;w u&#347;wiadomi&#322;a mi kilka rzeczy. Np. dlaczego jedne web serwisy Googli dzia&#322;aj&#261; a Microsoftu &amp;#8211; nie.  Wszystko wskazuj na to, &#380;e &lt;span class="caps"&gt;SOAP&lt;/span&gt; jest kiepskim protoko&#322;em. Jest niedopracowany i niejednoznaczny co daje innym za du&#380;e pole do wprowadzania autorskich modyfikacji.  kto jak kto, al e firma M$ bardzo skwapliwie z takich rzeczy korzysta. Microsoft si&#281; chyba lubuje we wprowadzaniu zamieszania.  Ich Internet Explorer nie tylko do dzi&#347; ma zamiaru liczy si&#281; ze standardami &lt;span class="caps"&gt;W3C&lt;/span&gt; ale tak&#380;e nie jest zgodny ze samym sob&#261; (tj. wcze&#347;niejszymi swymi wersjami).  Za&#322;o&#380;&#281; si&#281; &#380;e co&#347; spieprzyli z &lt;span class="caps"&gt;SOAP&lt;/span&gt;. Jak ma si&#281; szcz&#281;&#347;cie to dzia&#322;a, jak nie, to zmuszaj&#261; ci&#281; aby&#347; korzysta&#322; z Windozy i ich rozwi&#261;za&#324;. Taka ich durna strategia &#380;e M$ ma najwyra&#378;niej wszystkie standardy gdzie&#347; i chce aby jego &amp;#8220;pomys&#322;y&amp;#8221; by&#322;y standardem i prawem dla wszystkich.&lt;/p&gt;


	&lt;p&gt;Druga rzecz, to sama kwestia filozofii &lt;span class="caps"&gt;REST&lt;/span&gt; vs klasyczne web serwisy. Np. deweloperzy &lt;a href="http://rubyonrails.org"&gt;Rails&#243;w&lt;/a&gt;, mimo &#380;e wspieraj&#261; jeszcze &lt;span class="caps"&gt;SOAP&lt;/span&gt; oraz i &lt;span class="caps"&gt;XML&lt;/span&gt;-RPC planuj&#261; wyrzuci&#263; obie te biblioteki poza nawias g&#322;&#243;wnego kodu swojego frameworka. Chc&#261; si&#281; zamiast tego skupi&#263; na &lt;span class="caps"&gt;REST&lt;/span&gt;. W kolejnych wersjach Rails&#243;w (2.0?) &lt;span class="caps"&gt;SOAP&lt;/span&gt; i &lt;span class="caps"&gt;XML&lt;/span&gt;-RPC b&#281;d&#261; co prawda dost&#281;pne ale ju&#380; tylko jako dodatkowe pluginy.&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;REST&lt;/span&gt; to nie &#322;adniejsze adresy &lt;span class="caps"&gt;URL&lt;/span&gt; i prostsze operacje czytania i zmiany zasob&#243;w serwera,. To tak&#380;e troch&#281; inna filozofia pracy zwi&#261;zana z podej&#347;ciem deklaratywnym a nie imperatywnym. Oparta nie tyle na zdarzeniach, co na stanach zasob&#243;w identyfikowanych jednoznacznie przez adres &lt;span class="caps"&gt;URL&lt;/span&gt; i przypisan&#261; mu akcj&#281;. (W najprotszej postaci &lt;span class="caps"&gt;GET&lt;/span&gt; s&#322;u&#380;y do odczytu zasobu, a &lt;span class="caps"&gt;POST&lt;/span&gt; do zmiany jego stanu).&lt;/p&gt;


	&lt;p&gt;Sprawa wygl&#261;d ciekawie i jestem zach&#281;cony aby j&#261; zbada&#263; i opisa&#263; po&#378;niej dok&#322;adniej i na przyk&#322;adach. Na razie odsy&#322;am do w/w artyku&#322;&#243;w kt&#243;re wszystko opisuj&#261; bardziej szczeg&#243;&#322;owo. Mi&#322;o&#347;nik&#243;w Rails&#243;w odsy&#322;am te&#380; do ksi&#261;&#380;ki &lt;a href="http://www.oreilly.com/catalog/9780596527310/"&gt;Rails Cookbook&lt;/a&gt; kt&#243;ra ma ca&#322;y rozdzia&#322; po&#347;wi&#281;cony zastosowaniu w &lt;span class="caps"&gt;REST&lt;/span&gt; w Ruby on Rails.&lt;/p&gt;


&lt;hr /&gt;

	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Jaki&#347; czas temu na jednej z konferencji w Warszawie firma Macromedia wychwala&#322;a pod niebiosa u&#380;ywanie web serwis&#243;w we Flashu. Aktualnie Macromedi&#281; wch&#322;on&#281;&#322;a firma Adobe.&lt;/p&gt;</description>
      <pubDate>Fri, 23 Mar 2007 01:50:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:3c1ea77c-f3b4-4f14-9281-00acdd90485c</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/03/23/rest-soap</link>
      <category>rest</category>
      <category>soap</category>
      <category>xmlrpc</category>
      <category>python</category>
      <category>ruby</category>
    </item>
  </channel>
</rss>
