# SOAP Axis-Client Einstieg



## Sebastiano06 (19. November 2007)

Hallo zusammen,

ich habe hier im Forum schon einige interessante Beiträge zum Thema SOAP mit Axis gefunden, leider finde ich gibt es keinen richtigen Einstieg für Java Neulinge wie mich.

Die Grundlagen von Java beherrsche ich natürlich schon, aber so ganz ins Blut übergegangen ist mir das Ganze noch nicht!

Kennt ihr irgendwelche wirklich guten Einsteiger-Tutorials oder hat vielleicht einer ein Buch, bei dem der komplette Funktionsumfang und Einsteigertutorials mit Codebeispielen vorhanden sind? Ich habe hier O'Reilly - Webservice-Programmierung mit SOAP liegen. Ein wirklich gutes Buch, leider aber nicht speziell auf Java bezogen sondern einfach nur auf SOAP. Nur 5 Seiten mit Java-Erklärungen...


----------



## synfader940 (20. November 2007)

Hallo,

ich habe vor einiger Zeit auch mit Axis begonnen. Geholfen hat mir:

http://www.torsten-horn.de/techdocs/java-soap-axis.htm

http://www.dfki.de/~sberg/smartweb/sysgroup/Axis_Entwicklung.html

und natürlich der Axis-Userguide:

http://ws.apache.org/axis/java/user-guide.html


Folgendes Buch beschäftigt sich ausschließlich mit Java und Axis (ist teilweise aber zu oberflächlich):

http://www.amazon.de/Java-Web-Servi...=sr_1_2?ie=UTF8&s=books&qid=1195559552&sr=1-2

Ich hoffe, es hilft Dir ein wenig weiter. Man muss sich ein wenig durchbeißen...
... dann klappt es aber auch mit Axis!

Grüße,
 Oliver


----------



## Sebastiano06 (20. November 2007)

Vielen Dank für die Antwort. Ich bin heute Nacht auch auf die Seite von Torsten Horn gestoßen und dadurch sehr viel weiter gekommen.
Vor allem die Funktion WSDL2Java vereinfacht mir das Ganze ungemein. Leider benutzt der Service den ich nutzen will Sessions und ich bin bisher noch nicht ganz dahinter gekommen wie ich das noch in die bereits automatisch erstellten Services Klassen implementiere.

Da der von mir genutzte Service aus mehreren Hundert Funktionen besteht ist das Ganze ein wenig unübersichtlich geworden... :-(


----------



## synfader940 (20. November 2007)

Als Einstieg einen Service mit mehreren Hundert Methoden... Respekt 

Unser Service arbeitet sinnvollerweise 
auch mit Sessions. Diese werden identifiziert durch SessionIDs, die der Server vergibt.
Da Du ja einen Client implementieren willst, brauchst Du Dir die IDs doch nur merken
und den Request-Methoden, die zu einer Session gehören mitgeben, oder?

Die WSDL2Java generiert ja nur die Methoden-Rümpfe. Die Implementierung ist Dir
überlassen.

Aber vielleicht verstehe ich Dich Dein Problem ja auch falsch...

Grüße,
 Oliver


----------



## Sebastiano06 (20. November 2007)

Also ich bin bisher so vorgegangen wie bei  Torsten: WebService-Client-mit-WSDL2Java beschrieben.

Funktioniert sehr gut beim ersten Aufruf (also qasi dem Login) bei dem ich noch keine SessionID benötige. Leider weiß ich aber nicht wie ich bei dem nächsten Aufruf die Sessionid mit übergebe.

Es gibt da von Seiten des Webservice 2 Möglichkeiten einmal am Ende der URL mit

```
http://(URL);jsessionid=[jsessionid]
```
oder in Form eines SessionCookies im Header

```
Cookie: JSESSIONID=[jsessionid]
```

Leider bin ich derzeit da noch total überfragt, deshalb gehe ich derzeit mal den kompletten Quellcode durch den mir WSDL2Java erzeugt hat.


----------



## Sebastiano06 (20. November 2007)

Ich bin einen ordentlichen Schritt weiter! Ich habe WSDL2Java mit dem Parameter "-d session" aufgerufen und in der Datei: "MeinServiceBindingStub.java" folgenden Code geändert:



```
//class extends org.apache.axis.client.Stub
   protected org.apache.axis.client.Call createCall() throws java.rmi.RemoteException {
        try {
            org.apache.axis.client.Call _call = super._createCall();
            /*

            if (super.maintainSessionSet) {
                _call.setMaintainSession(super.maintainSession);
            }
            */
/////
            // Obige Abfrage auskommentiert und einfach mit true aufgerufen
/////            
            _call.setMaintainSession(true);
            
            if (super.cachedUsername != null) {
                _call.setUsername(super.cachedUsername);
            }
            if (super.cachedPassword != null) {
                _call.setPassword(super.cachedPassword);
            }
            if (super.cachedEndpoint != null) {
                _call.setTargetEndpointAddress(super.cachedEndpoint);
            }
            if (super.cachedTimeout != null) {
                _call.setTimeout(super.cachedTimeout);
            }
            if (super.cachedPortName != null) {
                _call.setPortName(super.cachedPortName);
            }
            java.util.Enumeration keys = super.cachedProperties.keys();
            while (keys.hasMoreElements()) {
                java.lang.String key = (java.lang.String) keys.nextElement();
                _call.setProperty(key, super.cachedProperties.get(key));
            }
            // All the type mapping information is registered
            // when the first call is made.
            // The type mapping information is actually registered in
            // the TypeMappingRegistry of the service, which
            // is the reason why registration is only needed for the first call.
            synchronized (this) {
                if (firstCall()) {
                    // must set encoding style before registering serializers
                    _call.setEncodingStyle(null);
                    for (int i = 0; i < cachedSerFactories.size(); ++i) {
                        java.lang.Class cls = (java.lang.Class) cachedSerClasses.get(i);
                        javax.xml.namespace.QName qName =
                                (javax.xml.namespace.QName) cachedSerQNames.get(i);
                        java.lang.Object x = cachedSerFactories.get(i);
                        if (x instanceof Class) {
                            java.lang.Class sf = (java.lang.Class)
                                 cachedSerFactories.get(i);
                            java.lang.Class df = (java.lang.Class)
                                 cachedDeserFactories.get(i);
                            _call.registerTypeMapping(cls, qName, sf, df, false);
                        }
                        else if (x instanceof javax.xml.rpc.encoding.SerializerFactory) {
                            org.apache.axis.encoding.SerializerFactory sf = (org.apache.axis.encoding.SerializerFactory)
                                 cachedSerFactories.get(i);
                            org.apache.axis.encoding.DeserializerFactory df = (org.apache.axis.encoding.DeserializerFactory)
                                 cachedDeserFactories.get(i);
                            _call.registerTypeMapping(cls, qName, sf, df, false);
                        }
                    }
                }
            }
            return _call;
        }
        catch (java.lang.Throwable _t) {
            throw new org.apache.axis.AxisFault("Failure trying to get the Call object", _t);
        }
    }
```

Nun funktionieren aufeinanderfolgende Aufrufe, leider wollte ich aber die Klassen nicht ändern, da ich dies jedesmal wenn der ServiceBetreiber seine WSDL-Files ändert wieder machen muss.
Jemand eine Idee wie ich das von außen mache.


----------



## Sebastiano06 (22. November 2007)

Sorry, dass ich jetzt einen 3fach Post mache, aber leider antwortet ja keiner. 
Ich habe soweit alles hinbekommen! Ein Problem habe ich habe noch! Wie kann ich manuell etwas in den Header setzen? Ich habe keine Cookie-Funktion gefunden, aber ich muss doch irgendwie der Anfrage an den Server im Header die Zeile 

```
Cookie: JSESSIONID=[jsessionid]
```
einfügen können!


----------



## synfader940 (22. November 2007)

Hallo Sebastiano06,

sorry, dass ich länger nicht geantwortet habe.

Mit Sessions in Soap-Headern habe ich noch nicht gearbeitet. Wir haben das 
- wie gesagt-  mit unseren eigenen Webservice-Methoden gelöst.

Ich habe mal in dem oben von mir erwähnten Buch gestöbert. Dort wird vom

```
org.apache.axis.handlers.SimpleSessionHandler
```
 gesprochen.
Dieser muss sowohl auf dem Client als auch auf dem Server in den Request Flow und
in den Response Flow eingebunden werden.

Bei der Google-Suche nach dem Handler, kommt man auf folgende Seite:
http://www.kiltz.de/Wiki.jsp?page=Ws.bsp.Session

Vielleicht hilft sie Dir weiter...

Grüße,
 Oliver


----------

