Python, javascript und XMLRPC

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
jhamel
User
Beiträge: 37
Registriert: Sonntag 2. Juli 2006, 16:03
Wohnort: Ostwestfalen
Kontaktdaten:

Hallo,
Ich habe ein großes Problem mit folgenden Szenario: Auf einen Server im Internet läuft ein python-twisted-web server mit xmlrpc, läuft seit 9 Jahren stabil und bestens. Ich kann mit python, java, c++ auf diesen Server zugreifen, alles wirklich ok. Nun kommt aber dieses Problem auf mich zu, das ich einen Webclient für mein Programm schreiben möchte. Leider gibt es keine andere Möglichkeit als javascript zu verwenden, so das ich verzweifelt probiere, mit js über xmlrpc auf meinen server zuzugreifen. Ich habe diverse javascript libs ausprobiert, aber es läuft überhaupt nicht. Dabei benötige ich wirklich nur die Grundfunktion, nichts kompliziertes. In Python sieht das so aus:

Code: Alles auswählen

import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://server.de:7080/")
print proxy.Database.is_running()
Als Antwort erhalte ich 42, alles bestens. Mit javascript passiert gar nichts ! Kann einer von euch mir helfen, kennt einer ein javascript Beispiel mit passender lib ? Ich habe mimic, xmlrpc_lib und einige andere ausprobiert, habe außerdem mit ngrep mal die Übertragung angeschaut, bei javascript wird alles übertragen, nur kein xmlrpc. Während bei python ein xml mit procedure Aufruf übertragen wird, sieht es bei javascript einfach nur wie normales http aus. Wahrscheinlich mache ich irgendwas grundsätzliches falsch, es wäre toll, wenn jemand mir helfen könnte.

Tschüss
Jürgen
lunar

Da Du über den Javascript-Code nichts sagst außer "geht nicht", kann man Dir jetzt irgendwie nur schlecht helfen :)
jhamel
User
Beiträge: 37
Registriert: Sonntag 2. Juli 2006, 16:03
Wohnort: Ostwestfalen
Kontaktdaten:

lunar hat geschrieben:Da Du über den Javascript-Code nichts sagst außer "geht nicht", kann man Dir jetzt irgendwie nur schlecht helfen :)
Hallo, leider gibt es da nicht viel zu sagen, Ich habe ca. 30 verschiedene Arten ausprobiert, z.B. :

Code: Alles auswählen

 
WHANDLER['on_okbutton1_clicked'] =
            function () {
                
                
             var userID = win_login.document.getElementById('TUserID').value ;  
             client = new xmlrpc_client("", "cuonsim1.de",7080,"http") ;
             response = client.send("Database.is_running");
             alert(response.value()); 
             win_login.close() ;
                
            };
Mit verschiedenen Libs in verschiedener Syntax. Deshalb meine Bitte, ganz einfach mir ein funktionierendes Beispiel zu senden. Zum Beispiel: Ich drücke auf den button, alles ist bestens, es wird eine Verbindung zum server aufgebaut und er sendet Daten. Aber die Daten scheinen mir nicht ok zu sein, Sie unterscheiden sich grundsätzlich von anderen xmlrpc clients, hier mal das python Beispiel:

Code: Alles auswählen

T 192.168.17.2:52608 -> 85.214.139.187:7080 [AP]
  POST / HTTP/1.0..Host: cuonsim1.de:7080..User-Agent: xmlrpclib.py/1.0.1 (by
   www.pythonware.com)..Content-Type: text/xml..Content-Length: 113....      
##
T 192.168.17.2:52608 -> 85.214.139.187:7080 [AP]
  <?xml version='1.0'?>.<methodCall>.<methodName>Database.is_running</methodN
  ame>.<params>.</params>.</methodCall>.                                     
##
T 85.214.139.187:7080 -> 192.168.17.2:52608 [AP]
  HTTP/1.0 200 OK..Date: Fri, 30 Jul 2010 08:44:02 GMT..Content-Length: 122..
  Content-Type: text/xml..Server: TwistedWeb/10.0.0....<?xml version='1.0'?>.
  <methodResponse>.<params>.<param>.<value><int>42</int></value>.</param>.</p
  arams>.</methodResponse>.        
Das ist sehr schön übersichtlich und so wie xmlrpc sein soll ! java, c# und c++ senden sehr ähnlich !!!
Nun zu den div. javascript clients:

Code: Alles auswählen

192.168.17.2:52613 -> 85.214.139.187:7080 [AP]
  POST /Database.is_running HTTP/1.1..Host: cuonsim1.de:7080..User-Agent: Moz
  illa/5.0 (X11; U; Linux i686; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (
  lucid) Firefox/3.6.8..Accept: text/html,application/xhtml+xml,application/x
  ml;q=0.9,*/*;q=0.8..Accept-Language: en,en-us;q=0.7,de;q=0.3..Accept-Encodi
  ng: gzip,deflate..Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7..Keep-Aliv
  e: 115..Connection: keep-alive..Referer: http://localhost/cuon/cuon.xul..Co
  ntent-Length: 19..Content-Type: text/plain; charset=UTF-8..Origin: http://l
  ocalhost..Pragma: no-cache..Cache-Control: no-cache....Database.is_running 
##
T 85.214.139.187:7080 -> 192.168.17.2:52613 [AP]
  HTTP/1.1 200 OK..Date: Fri, 30 Jul 2010 08:46:10 GMT..Content-Length: 298..
  Content-Type: text/xml..Server: TwistedWeb/10.0.0....<?xml version='1.0'?>.
  <methodResponse>.<fault>.<value><struct>.<member>.<name>faultCode</name>.<v
  alue><int>8002</int></value>.</member>.<member>.<name>faultString</name>.<v
  alue><string>Can't deserialize input: ResponseError()</string></value>.</me
  mber>.</struct></value>.</fault>.</methodResponse>.    
Mein python Server antwortet selbstverständlich mit einer Fehlermeldung, weil das, was ankommt, einfach nicht ok ist. Wenn also einer eine funktionierende xmlrpc lib mit beispiel für javascript kennt, währe ich sehr dankbar.
Tschüss
Jürgen
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Welche JavaScript XML-RPC-Libraries hast du denn schon ausprobiert?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jhamel
User
Beiträge: 37
Registriert: Sonntag 2. Juli 2006, 16:03
Wohnort: Ostwestfalen
Kontaktdaten:

Leonidas hat geschrieben:Welche JavaScript XML-RPC-Libraries hast du denn schon ausprobiert?
http://www.zentus.com/js/xmlrpc.js.html

http://www.scottandrew.com/xml-rpc/

http://phpxmlrpc.sourceforge.net/jsxmlrpc/

http://www.vcdn.org/Public/XMLRPC/

http://mimic-xmlrpc.sourceforge.net/

Diese habe ich bis auf http://www.vcdn.org/Public/XMLRPC/ alle ausprobiert, und dort hat sich seit 2001 nichts getan, so das ich das mal außen vor gelassen habe. Ich habe ein paar zusätzliche ausprobiert und es sieht mir so aus, als ob es unter javascript ein anderes Verständnis von xmlrpc gibt als ich es verstehe.
Für mich sieht es so aus, als ob die irgendeine statische Seite anfordern während ich mit xmlrpc Daten an eine python function übergeben möchte und ggf. einen Rückgabewert haben möchte.
Ich möchte die Hoffnung nicht aufgeben, das es irgendwen gibt, der mit js eine xmlrpc function aufgerufen hat. Wenn dem nicht so ist, kann mir irgendwer einen guten Einstieg geben, das ich das selber schreibe ?

Tschüss
Jürgen
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kannst du mal eben eine Kurzversion deines XML-RPC-Servers posten, so dass man sich den zum Testen nicht selbst schreiben muss? Ich habe nämlich wenig Lust erst ein passendes Setup aufbauen zu müssen bevor ich dein Problem überhaupt angehen kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jhamel
User
Beiträge: 37
Registriert: Sonntag 2. Juli 2006, 16:03
Wohnort: Ostwestfalen
Kontaktdaten:

Leonidas hat geschrieben:Kannst du mal eben eine Kurzversion deines XML-RPC-Servers posten, so dass man sich den zum Testen nicht selbst schreiben muss? Ich habe nämlich wenig Lust erst ein passendes Setup aufbauen zu müssen bevor ich dein Problem überhaupt angehen kann.
Hallo,
am einfachsten nutzt du cuonsim1.de auf dem Port 7080, funktion Database.is_running, hier der test client für python, rückgabe ist 42, dieser client sollte dann auch in javascript funktionieren.
Der Server ist nicht so einfach zu kürzen, er hat ein paar tausend zeilen, sorry.

Code: Alles auswählen

import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://cuonsim1.de:7080/")
print proxy.Database.is_running()
Tschüss
Jürgen
jhamel
User
Beiträge: 37
Registriert: Sonntag 2. Juli 2006, 16:03
Wohnort: Ostwestfalen
Kontaktdaten:

ok,
hier ein paar Neuigkeiten:
Ich habe mir mal die js library mimic vorgenommen und leicht verändert ( Sorry, Ich bin erst vorgestern mit javascript angefangen und verstehe noch nicht soviel davon) .

Code: Alles auswählen

178    xhr.open("POST", this.serviceUrl, false);   
179    /*xhr.send(Builder.buildDOM(xml_call));*/
180    var getIt = xhr.send(xml_call);
ich habe also xhr.send auskommentiert und neu reingesetzt, aber nicht mehr den xml_call durch den Builder gejagt. Dadurch wird jetzt schon ein einigermaßen nettes xml gesendet und - Ein Wunder - mein Server kann es empfangen, verstehen und die richtige Anwort zurücksenden.
Leider wird die Antwort nicht akzeptiert, aber ich hoffe, da auch noch eine Lösung zu finden. Das hier ist die javascript Fehlermeldung:

Code: Alles auswählen

Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.send]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: http://localhost/cuon/mimic/mimic.js :: anonymous :: line 180"  data: no]
Ich glaube, das ich da irgendwas beim senden noch einstellen muß, mir kommt das Content-Type text/plain noch seltsam vor, oder ?

Code: Alles auswählen

T 192.168.17.2:57571 -> 85.214.139.187:7080 [AP]
  POST / HTTP/1.1..Host: cuonsim1.de:7080..User-Agent: Mozilla/5.0 (X11; U; L
  inux i686; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.
  8..Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
  .Accept-Language: en,en-us;q=0.7,de;q=0.3..Accept-Encoding: gzip,deflate..A
  ccept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7..Keep-Alive: 115..Connection:
   keep-alive..Referer: http://localhost/cuon/cuon.xul..Content-Length: 112..
  Content-Type: text/plain; charset=UTF-8..Origin: http://localhost..Pragma: 
  no-cache..Cache-Control: no-cache....<?xml version="1.0"?>.<methodCall>.<me
  thodName>Database.is_running</methodName>.<params>.</params>.</methodCall> 
##
T 85.214.139.187:7080 -> 192.168.17.2:57571 [AP]
  HTTP/1.1 200 OK..Date: Fri, 30 Jul 2010 14:28:59 GMT..Content-Length: 122..
  Content-Type: text/xml..Server: TwistedWeb/10.0.0....<?xml version='1.0'?>.
  <methodResponse>.<params>.<param>.<value><int>42</int></value>.</param>.</p
  arams>.</methodResponse>.           
Tschüss
Jürgen
BlackJack

@jhamel: mimic.js wird anscheinend nicht mehr gepflegt und funktioniert zumindest im Firefox nicht (mehr).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ok, du weißt aber schon dass für XML-RPC die Same-Origin-Policy gilt und ich das so nicht nutzen kann?
Javascript Library hat geschrieben:Unable to use the XML-RPC protocol to access services on other domains.

Code: Alles auswählen

<html>
  <head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="rpc.js"></script>
    <script type="text/javascript">
    $(document).ready(function() {
      var service = new rpc.ServiceProxy("http://cuonsim1.de:7080/", {protocol: 'XML-RPC', sanitize: false});
      console.log(service);
    })
    </script>
  </head>
  <body>
  </body>
</html>
(nutzt json-xml-rpc, was wie ne ziemlich brauchbare Library aussieht, auch weils nette Proxy-Objekte bereitstellt)

Ergo müsstest du entweder das auf der gleichen Domain haben oder JSON-RPC nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jhamel
User
Beiträge: 37
Registriert: Sonntag 2. Juli 2006, 16:03
Wohnort: Ostwestfalen
Kontaktdaten:

Leonidas hat geschrieben:Ok, du weißt aber schon dass für XML-RPC die Same-Origin-Policy gilt und ich das so nicht nutzen kann?
Danke erstmal für deine Mühe. Ich hatte diese Policy so vestanden, das ich nicht einen service auf localhost ausführen kann, aber durchaus einen Service im Internet aufrufen kann. und das o.g. Netzwerkprotokoll zeigt ja auch, das ich auf meinen Server komme. Ich habe folgende Tests gemacht:
Browser und Server auf localhost, Zugriff wird verweigert.
Browser auf localhost , Server auf cuonsim1.de, Daten weden gesendet, empfangen und Ergenis zurückgeschickt.
Nur klappt anscheinend nicht der Empfang. Evtl. wende ich mich mal an ein Javascript Forum, von python Seite scheint ja alles ok zu sein und der js Bereich ist vielleicht doch beschi*****ner als ich dachte.
Trotzdem, wenn einer eine Lösung weiss, ich bin für jeden Tipp dankbar.

Tschüß
Jürgen
Antworten