# Client für WebService programmieren (aus WSDL-File)



## Juliane (14. Jun 2005)

Hallo, 
ich versuche, einen Client zu programmieren, der auf einen WebService zugreift. 
Habe vom Entwickler des WebServices die entsprechende wsdl-Datei bekommen und versuche jetzt, Abfragen zu senden und auch Antworten zu bekommen. 

Bis jetzt habe ich folgendes gemacht: 
- aus der wsdl-Datei mit WSDL2Java die entsprechenden Java-Files erzeugt 
- ein einfaches Client-Programm geschrieben, das erstmal nur auf eine der Methoden des Service zugreifen soll und das Ergebnis als String ausgibt
- das Programm kompiliert und gestartet 

>>>>>Leider kriege ich immer nur *UnknownHostExceptions *  

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode:
 faultString: java.net.UnknownHostException: ollilap
 faultActor:
 faultNode:
 faultDetail:
        {http://xml.apache.org/axis/}stackTrace:java.net.UnknownHostException: ollilap
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:153)
        at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:120)
        at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:181)
        at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:397)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:135)
        at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2754)
        at org.apache.axis.client.Call.invoke(Call.java:2737)
        at org.apache.axis.client.Call.invoke(Call.java:2413)
        at org.apache.axis.client.Call.invoke(Call.java:2336)
        at org.apache.axis.client.Call.invoke(Call.java:1793)
        at ollilap.axis.services.XXXWebService.XXXWebServiceSoapBindingStub.operation1 XXXWebServiceSoapBindingStub.java:547)
        at XXXWebTest.runIt(XXXWebTest.java:38
        at XXXWebTest.main(XXXWebTest.java:26)

        {http://xml.apache.org/axis/}hostnameell1

java.net.UnknownHostException: ollilap
        at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144)

        at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrateg
y.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2754)
        at org.apache.axis.client.Call.invoke(Call.java:2737)
        at org.apache.axis.client.Call.invoke(Call.java:2413)
        at org.apache.axis.client.Call.invoke(Call.java:2336)
        at org.apache.axis.client.Call.invoke(Call.java:1793)
        at ollilap.axis.services.XXXWebService.XXXWebServiceSoapBindingStub.operation1(XXXWebServiceSoapBindingStub.java:547)
        at XXXWebTest.runIt(XXXWebTest.java:38
        at XXXWebTest.main(XXXWebTest.java:26)
Caused by: java.net.UnknownHostException: ollilap
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSoc
ketFactory.java:153)
        at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSoc
ketFactory.java:120)
        at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:1
81)
        at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.ja
va:397)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:135)

        ... 12 more

Ein Ausschnitt aus meinem Client-Programm: 


```
public class XXXWebTest 
{ 
    public static void main(String [] args) throws Exception { 
        try { 
            runIt(); 
        } catch(Exception e) { 
            e.printStackTrace(); 
        } 
    } 
  
    private static void runIt() throws Exception { 
        String ret = ""; 
  
        XXXWebServiceService service = new XXXWebServiceServiceLocator(); 
        XXXWebService port = service.getXXXWebService(); 
        ret = (String) port.operation1(null,null,"String1","String2",null,null,null,true,new int[] {0}); 
  
        System.out.println(ret); 
    } 
}
```
Kann mir irgendjemand sagen, was ich falsch mache? Sitz jetzt schon über ne Woche daran und bin am verzweifeln. Kann doch nich so schwer sein, auf einen WebService zuzugreifen. 

Alle Beispiele (aus Tutorials...), die ich ausprobiert habe, funktionieren. Da wird allerdings auch immer auf localhost zugegriffen.


----------



## KISS (14. Jun 2005)

java.net.UnknownHostException: ollilap 
sagt uns das der host olliap nicht gefunden wird, wirst wohl mal deinen servicelocator konfigurieren muessen


----------



## Juliane (14. Jun 2005)

Wie macht man das?
(Soory - sind alles Fremdwörter für mich. Versuche gerade erst mich da ein bisschen reinzuarbeiten. Is wohl nich so
 gut für nen Java-Anfänger, gleich mit WebServices anfangen zu müssen ;o)


----------



## KISS (14. Jun 2005)

aeh, ich fuercht du wirst nicht umhinkommen die doku zu lesen, bei schnellem ueberfliegen habe ich was gefunden was dein problem sein sollte (bin mir da nicht 100% sicher)

Normally, a client program would not instantiate a stub directly. It would instead instantiate a service locator and call a get method which returns a stub. This locator is derived from the service clause in the WSDL. WSDL2Java generates two objects from a service clause. For example, given the WSDL:

<service name="AddressBookService">
  <port name="AddressBook" binding="tns:AddressBookSOAPBinding">
    <soap:address location="http://localhost:8080/axis/services/AddressBook"/>
  </port>
</service>

WSDL2Java will generate the service interface:

public interface AddressBookService extends javax.xml.rpc.Service {
  public String getAddressBookAddress();

  public AddressBook getAddressBook() throws javax.xml.rpc.ServiceException;

  public AddressBook getAddressBook(URL portAddress)
      throws javax.xml.rpc.ServiceException;
}

WSDL2Java will also generate the locator which implements this interface:

public class AddressBookServiceLocator extends org.apache.axis.client.Service
    implements AddressBookService {
  ...
}

The service interface defines a get method for each port listed in the service element of the WSDL. The locator is the implementation of this service interface. It implements these get methods. It serves as a locator for obtaining Stub instances. The Service class will by default make a Stub which points to the endpoint URL described in the WSDL file, but you may also specify a different URL when you ask for the PortType.

A typical usage of the stub classes would be as follows:

public class Tester {
  public static void main(String [] args) throws Exception {
    // Make a service
    AddressBookService service = new AddressBookServiceLocator();

    // Now use the service to get a stub which implements the SDI.
    AddressBook port = service.getAddressBook();

    // Make the actual call
    Address address = new Address(...);
    port.addEntry("Russell Butek", address);
  }
}


----------



## Juliane (14. Jun 2005)

Is es das, was ich nich verstehe?:



> The Service class will by default make a Stub which points to the endpoint URL described in the WSDL file, but
> you may also specify a different URL when you ask for the PortType.



Das Beispiel (AddressBook) hab ich schon ausprobiert. Klappt auch alles. Dazu hab ich aber vorher mit ner 
deploy.wsdd-Datei den Service lokal "deployed", greife also auf http://localhost:8080/axis/services/AddressBook zu. 
Dann gehts ja auch. Hab auch das Beispiel AmazonWebService hingekriegt und konnte drauf zugreifen (will damit nur
sagen, dass ich schon ne Woche lang Dokus und Tutorials lese ;o)

Im Prinzip hab ich ja ansonsten genau das gleiche gemacht wie im AddressBook-Beispiel. Oder???? *verzweifeltkuck*


----------



## KISS (14. Jun 2005)

in deinem deployment muss irgendwo (deploy.wsdd?) als url so etwas wie http://olliap ... eingetragen sein (sonst wuerde er nicht danach suchen)

also 2 moeglichkeiten: 
1. der hostname stimmt, dann musst du feststellen warum er nicht erreichbar ist oder warum der dns ihn nicht aufloest
2. der hostname stimmt nicht, dann musst du ihn im deployment aendern

falls du nicht mit wsdd sondern mit jws analog dazu. da ich noch nichts mit axis gemacht habe kann ich dir nur empfehlen (falls du die files nicht findest) mit grep -R '://olliap' die platte zu durchsuchen


----------



## Bleiglanz (14. Jun 2005)

sind die vielen "null" Werte beim Aufruf erlaubt?

das leere Array?

poste mal das wsdl (oder zumindest die operations für deinen Aufruf)


----------



## Juliane (14. Jun 2005)

> poste mal das wsdl (oder zumindest die operations für deinen Aufruf)



hier mal ein Teil der (eigentlich riesigen) wsdl-Datei:


```
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://ollilap:8081/axis/services/XXXWebService"
xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://ollilap:8081/axis/services/XXXWebService"
xmlns:intf="http://ollilap:8081/axis/services/XXXWebService"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://www.w3.org/1999/XMLSchema"
xmlns:tns2="http://www.w3.org/2003/05/soap-encoding" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.2alpha
Built on Dec 01, 2003 (04:33:24 EST)-->
 <wsdl:types>
  <schema targetNamespace="http://ollilap:8081/axis/services/XXXWebService" xmlns="http://www.w3.org/2001/XMLSchema">
   <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
   <complexType name="ArrayOf_xsd_int">
    <complexContent>
     <restriction base="soapenc:Array">
      <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/>
     </restriction>
    </complexContent>
   </complexType>
  </schema>
 </wsdl:types>

   <wsdl:message name="Response1">

      <wsdl:part name="Return1" type="tns2:string"/>

   </wsdl:message>

   <wsdl:message name="Request1">

      <wsdl:part name="Param1" type="tns2:string"/>

      <wsdl:part name="Param2" type="tns2:string"/>

      <wsdl:part name="Param3" type="tns2:string"/>

      <wsdl:part name="Param4" type="tns2:string"/>

      <wsdl:part name="Param5" type="tns2:string"/>

      <wsdl:part name="Param6" type="tns2:string"/>

      <wsdl:part name="Param7" type="tns2:string"/>

      <wsdl:part name="Param8" type="xsd:boolean"/>

      <wsdl:part name="Param9" type="impl:ArrayOf_xsd_int"/>

   </wsdl:message>

   <wsdl:portType name="XXXWebService">

      <wsdl:operation name="operation1" parameterOrder="Param1 Param2 Param3 Param4 Param5 Param6 Param7 Param8 Param9">

         <wsdl:input message="impl:Request1" name="Request1"/>

         <wsdl:output message="impl:Response1" name="Response1"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="XXXWebServiceSoapBinding" type="impl:XXXWebService">

      <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="operation1">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="Request1">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>

         </wsdl:input>

         <wsdl:output name="Response1">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://ollilap:8081/axis/services/XXXWebService" use="encoded"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="XXXWebServiceService">

      <wsdl:port binding="impl:XXXWebServiceSoapBinding" name="XXXWebService">

         <wsdlsoap:address location="http://ollilap:8081/axis/services/XXXWebService"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>
```

Hoffe, ich hab beim Editieren nicht irgendwas falsch gemacht.


----------



## Juliane (14. Jun 2005)

> in deinem deployment muss irgendwo (deploy.wsdd?) als url so etwas wie http://olliap ... eingetragen sein
> (sonst wuerde er nicht danach suchen)
> 
> also 2 moeglichkeiten:
> ...



ich habe noch keine deploy.wsdd-Datei erstellt, weil ich dachte, das ist nicht nötig, wenn man nicht auf localhost 
sondern auf einen "externen" WebService zugreifen will.
In der wsdl-Datei ist http://ollilap usw definiert (siehe letztes Posting)

also zu 1. (der Hostname stimmt nicht): kann ich eigentlich nich glauben, weil ich die wsdl-Datei erst vor 2 Wochen
 gekriegt habe und das aktuell sein müsste (oder hab ich da schon nen riesigen Denkfehler drin?)
zu 2.: um den Service zu deployen reicht doch nich die wsdl-Datei aus, oder? Die automatisch (wsdl2java) generierte
Datei sieht so aus:

```
<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

  

  <service name="XXXWebService" provider="java:RPC" style="rpc" use="encoded">
      <parameter name="wsdlTargetNamespace" value="http://ollilap:8081/axis/services/XXXWebService"/>
      <parameter name="wsdlServiceElement" value="XXXWebServiceService"/>
      <parameter name="wsdlServicePort" value="XXXWebService"/>
      <parameter name="className" value="ollilap.axis.services.XXXWebService.XXXWebServiceSoapBindingSkeleton"/>
      <parameter name="wsdlPortType" value="XXXWebService"/>
      <parameter name="typeMappingVersion" value="1.2"/>
      <parameter name="allowedMethods" value="*"/>

      <typeMapping
        xmlns:ns="http://ollilap:8081/axis/services/XXXWebService"
        qname="ns:ArrayOf_xsd_int"
        type="java:int[]"
        serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
        deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
      />
  </service>
</deployment>
```

da steht aber auch wieder http://ollilap drin (is ja auch klar) --> also würde es auch nix bringen, den Service zu deployen?


----------



## KISS (14. Jun 2005)

kannst du den host olliap anpingen? wenn ja, welche ip liefert er? kannst du die url
http://ollilap:8081/axis/services/XXXWebService im webbrowser oeffnen?


----------



## Juliane (14. Jun 2005)

Nein, kann ich nich öffnen und auch nich anpingen. Aber wenn die URL im wsdl-File drin steht, dann muss es die doch geben. /

http://ollilap:8081/axis/services/MesoWebService
--> vielleicht kann ja jemand anderes darauf zugreifen?


----------



## Juliane (14. Jun 2005)

Hab in den Unterlagen noch ne ganz alte Datei gefunden, mit der angeblich mal auf den WebService zugegriffen 
werden konnte (aber auch nich von hier aus). Da heisst der String endpoint so:

https://ollilap.hsh-berlin.com:8443/axis/services/MesoWebService


----------



## KISS (14. Jun 2005)

> Nein, kann ich nich öffnen und auch nich anpingen. Aber wenn die URL im wsdl-File drin steht, dann muss es die doch geben.
> Nach oben[/qote]
> 
> nun ja, wenn du in das wsdd die url https://ich.bin.hier.nasa.gov?wirklich=yes schreibst, heist das noch lange nicht das sie auch da ist.
> ...


----------



## Juliane (14. Jun 2005)

also heißt das jetzt, dass die mir wahrscheinlich ne total veraltete wsdl-Datei geschickt haben und es den 
Hostnamen gar nich mehr gibt?


----------



## KISS (14. Jun 2005)

Well, life is a bitch.
naja, nicht unbedingt. es koennte ein host sein der nur innerhalb der firma oder eines vpns erreichbar ist. aber warscheinlich ist die datei einfach nur veraltet.


----------



## Juliane (14. Jun 2005)

Na toll. /
Und sowas machen die mit nem Java-Anfänger.
Dann ruf ich da morgen gleich mal an und frag mal nach.

Aber trotzdem danke erstmal. Jetzt kann ich da wenigstens anrufen ohne mich zum Klopps zu machen, weil ich
überhaupt keine Ahnung habe wovon ich rede. *g*

Also bis dann (hier wird man wenigstens geholfen   )

Juliane


----------

