Axis2 und XML-RPC

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Axis2 und XML-RPC

    Hallo allerseits,

    wie schreibe ich einen Client in Axis2, welcher über XML-RPC kommuniziert? Benötige ich dazu die Axiom API? Und wenn ja wie könnte eine Beispiel-Implementierung aussehen?
    Ich möchte auf einen WebService zugreifen und dazu jeweils 3 unterschiedliche Kommunikationsarten bzw. Architekturstile verwenden SOAP, REST und XML-RPC.
    Für Letzteres fehlt mir leider das Grundverständnis. Kann mir jemand weiterhelfen?
  • Hi.
    welche Frage hast du denn zum Grundverständnis?
    Wenn du keine konkrete Frage hast, kann ich dir nur die Wikipedia runterzitieren: [wikipedia]Remote_Procedure_Call[/wikipedia]

    Was für einen Client programmierst du denn?
    Wenn "ein" Server verschiedene Varianten anbietet, macht es ja nur Sinn die "beste" Variante im Client umzusetzen.

    Du postest nicht im Java Forum, daher scheint es dir nicht um die Implementierung zu gehen (als Beispiel habe ich nur das gefunden: ws.apache.org/axis2/1_2/pojoguide.html#testingpojows)
  • Hallo und Danke erstmal für die Antwort.
    Also tatsächlich geht es mir um die Implementierung, konnte das Thema leider nicht so recht zuordnen.
    Ich verstehe nicht ganz wie ein Aufruf mittels XML-RPC funktioniert und kann es demnach nicht umsetzen.
    Einen Client mittels RPCServiceClient habe ich schon geschrieben aber ich frage mich wo da das XML bleibt.
    Sollte die Implementierung nicht irgendwie XML enthalten? Wenn ich den Client ausführe und TCPMon
    dazwischen schalte, sehe ich wiederum einen SOAP Body. Woran erkenne ich denn das der Methodenaufruf
    über XML-RPC erfolgt ist? In Axis2 gibt es noch das Objektmodell AXIOM mit dem man XML-basierte Clients
    schreiben kann aber wie das funktioniert weiß ich leider auch nicht.
    Das Ganze findet im Rahmen einer Projektarbeit statt und das ist das einzige was mir noch fehlt.
    Was XML und RPC ist weiß ich, kanns aber nicht mit Axis verknüpfen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Studdi23 ()

  • Studdi23 schrieb:

    Sollte die Implementierung nicht irgendwie XML enthalte

    Nein, du sollst zumindest kein XML Code mit lustigen eckigen Klammern schreiben.

    Schau dir das ob verlinkten Wetter Beispiel an. Dort wird mit QName Instanzen gearbeitet
    QName represents a qualified name as defined in the XML specifications. The value of a QName contains a Namespace URI, local part and prefix.

    QName ist als eine XML Abstraktion. Du verwendest als Klassen und Java baut dir einen XML String im Hintergrund.

    Das Wetter Beispiel mit invokeRobust arbeitet schon ziemlich nahe am XML.
    Ich habe hier noch weitere Beispiele, die deutlich simpler sind:

    Quellcode

    1. XmlRpcClient xmlrpc = new XmlRpcClient("http://.../RPC");
    2. Vector params = new Vector();
    3. params.addElement("param1");
    4. params.addElement(new Integer(10));
    5. xmrpc.execute("klasse.methode", params);


    Ein paar Ergebnisse findest du auf diese Art: [google]"new xmlrpcclient" filetype:java[/google]

    Auch ein netter Treffer mit vielen XMLRPCClient Beispielen:
  • Das ich keine XML-Syntax in den Java Klassen verwenden muß ist mir schon klar. Nur wie gesagt habe ich keinen Nachweis dafür das es sich
    auch wirklich beim Code um XML-RPC handelt. Die von dir aufgeführten Beispiele habe ich auch schon ausprobiert. Folgendes ist dabei rausgekommen.

    Test-Client:

    Quellcode

    1. import java.util.Vector;
    2. import org.apache.xmlrpc.XmlRpcClient;
    3. public class XMLRPCTestClient {
    4. public static void main (String args[]) {
    5. try {
    6. String MethodName = "printVinstance";
    7. XmlRpcClient xmlrpc = new XmlRpcClient
    8. ("http://localhost:5555/axis2/services/ReadMetaData?wsdl");
    9. Vector params = new Vector ();
    10. Vector result = (Vector) xmlrpc.execute (MethodName, params);
    11. for (int i=0; i < result.size(); i++) {
    12. System.out.println (result.elementAt(i));
    13. }
    14. } catch (Exception e) {
    15. System.err.println (e.toString());
    16. }
    17. }
    18. }
    Alles anzeigen


    Wenn ich allerdings den Client ausführe erhalte ich die diese Fehlermeldung:
    java.io.IOException: Server returned HTTP response code: 500 for URL: localhost:5555/axis2/services/ReadMetaData?wsdl

    Ein Blick auf TCPMon bringt Licht ins Dunkel.

    Request:

    POST /axis2/services/ReadMetaData?wsdl HTTP/1.1
    Content-Length: 102
    Content-Type: text/xml
    Cache-Control: no-cache
    Pragma: no-cache
    User-Agent: Java/1.5.0_18
    Host: 127.0.0.1:5555
    Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Connection: keep-alive

    <?xml version="1.0"?>
    <methodCall>
    <methodName>printVinstance</methodName>
    <params></params>
    </methodCall>


    Response

    Transfer-Encoding: chunked
    Date: Thu, 10 Sep 2009 20:08:39 GMT
    Connection: close

    1e1
    <?xml version='1.0' encoding='UTF-8'?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
    <wsa:Action>w3.org/2005/08/addressing/soap/fault</wsa:Action>
    </soapenv:Header>
    <soapenv:Body>
    <soapenv:Fault>
    <faultcode></faultcode>
    <faultstring>First Element must contain the local name, Envelope , but found methodCall</faultstring>
    <detail />
    </soapenv:Fault>
    </soapenv:Body>
    </soapenv:Envelope>0


    Scheint als könnte Axis2 die Informationen nicht verarbeiten weil kein XML-Schema vorliegt.
    Wie gesagt bei RPCServiceClient bin ich mir auch nicht sicher, weil der Request genauso aussieht
    wie wenn ich einen generierten Stub-Client benutze.
  • Dein Pfad ReadMetaData?wsdl lässt irgendwie vermuten, dass es sich beim Endpoint um eine WSDL handelt.
    Der XMLRPC-Client kann sich nur mit Servern unterhalten, die das selbe Protokoll sprechen..

    also kein SOAP - sondern ein XMLRPC Server.
    Die Beispielimplementierung findest du hier: ws.apache.org/xmlrpc/server.html

    Quellcode

    1. package org.apache.xmlrpc.demo.webserver;
    2. import java.net.InetAddress;
    3. import org.apache.xmlrpc.common.TypeConverterFactoryImpl;
    4. import org.apache.xmlrpc.demo.webserver.proxy.impls.AdderImpl;
    5. import org.apache.xmlrpc.server.PropertyHandlerMapping;
    6. import org.apache.xmlrpc.server.XmlRpcServer;
    7. import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
    8. import org.apache.xmlrpc.webserver.WebServer;
    9. public class Server {
    10. private static final int port = 8080;
    11. public static void main(String[] args) throws Exception {
    12. WebServer webServer = new WebServer(port);
    13. XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
    14. PropertyHandlerMapping phm = new PropertyHandlerMapping();
    15. /* Load handler definitions from a property file.
    16. * The property file might look like:
    17. * Calculator=org.apache.xmlrpc.demo.Calculator
    18. * org.apache.xmlrpc.demo.proxy.Adder=org.apache.xmlrpc.demo.proxy.AdderImpl
    19. */
    20. phm.load(Thread.currentThread().getContextClassLoader(),
    21. "MyHandlers.properties");
    22. /* You may also provide the handler classes directly,
    23. * like this:
    24. * phm.addHandler("Calculator",
    25. * org.apache.xmlrpc.demo.Calculator.class);
    26. * phm.addHandler(org.apache.xmlrpc.demo.proxy.Adder.class.getName(),
    27. * org.apache.xmlrpc.demo.proxy.AdderImpl.class);
    28. */
    29. xmlRpcServer.setHandlerMapping(phm);
    30. XmlRpcServerConfigImpl serverConfig =
    31. (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
    32. serverConfig.setEnabledForExtensions(true);
    33. serverConfig.setContentLengthOptional(false);
    34. webServer.start();
    35. }
    36. }
    Alles anzeigen
  • Achso ok, das wußte ich nicht. In Axis2 wird generell nur mit WSDL Dokumenten gearbeitet und dementsprechend lautet dann auch
    der Endpoint. Damit fällt dann die Klasse XmlRpc erstmal weg. Ich schätze ich werde mich noch etwas mit AXIOM ausseinandersetzen.
    Dort ist glaube ich die richtige Lösung zu suchen. Vielen Dank soweit für deine Hilfe