# Schnittstelle über Webservice SOAP



## PrimeTimeBob (19. Jan 2009)

Hallo
Also ich soll mich jetzt mit folgendem auseinandersetzten und brauche dringend hilfe und tipps von euch.
Ich soll zu einen bestimmte Programm eine-Schnittstelle entwerfen, 
die über einen WebService (SOAP) zur Verfügung gestellt werden soll.

Könnt ihr mir den genau erklären wie das funktionieren soll und was ich beachten muss und wie
genau das funktioniert und vieleicht schonmal ein paar Starthilfen geben könnt.


----------



## Ebenius (19. Jan 2009)

Zuerst solltest Du Dich informieren, was SOAP eigentlich ist. Ich fange meist mit der Wikipedia an... wikipedia: SOAP. Vielleicht nützt Dir auch der Sun Artikel: Overview of SOAP etwas. Vielleicht ein einfaches Tutorial w3schools: SOAP. Dann kannst Du Dir noch ein WebService-Framework für Java™ ansehen; zum Beispiel Apache Axis2. Und dann solltest Du viel Zeit einplanen, bis Deine ersten Beispiele funktionieren.

Zum Entwickeln hilft sicher das Eclipse Webtools Projekt. Und ein nicht zu unterschätzendes kleines Tool zum Debuggen, namens tcpmon: An open-source utility to Monitor A TCP Connection.

Viel Erfolg!
Ebenius


----------



## PrimeTimeBob (19. Jan 2009)

ok danke ich werde mir die ganzen Dinge mal anschauen
Freue mich natürlich über jedes weiter post die Hilfe geben
könnten.
Danke


----------



## Landei (20. Jan 2009)

Ich habe mal was zum Auslesen unserer WS geschrieben. Unser altes Bea-Toolkit benennt die Parameter allerdings sehr übersichtlich mit "string","string0","string1" usw., das müsste man dann entprechend ändern:

```
import java.net.*;
import java.io.*;

import java.util.List;
import java.util.Arrays;

public class WebServiceCaller {

  private static final String callURL =
      "http://%s/Web-Services/%s";
  private static final String envelope =
      "<?xml version='1.0'?>" +
      "<env:Envelope  xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'" +
      "  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +
      "  xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'" +
      "  xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" +
      " <env:Header/>" +
      " <env:Body   env:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>" +
      "  <m:%s xmlns:m='http://%s'>%s</m:%1$s>" +
      " </env:Body>" +
      "</env:Envelope>";

  private WebServiceCaller() {
    //do not instantiate
  }
  /*
     Example:
     ip = 10.211.10.21:6202
     ws = InventoryWebService
     wsMethod = getInventoryTag
     wsClass = inventorytag.wgs.ws.guardian.com
     content = List{D1814898, 00000000.00B2.17, en, en_US, en_US, en_US}
   <string xsi:type='xsd:string'>
  */
  public static String call(String ip, String ws, String wsMethod, String wsClass, List<String> content)
      throws Exception {
      StringBuilder sb = new StringBuilder();
      String tag = "string";
      for (int i = 0; i < content.size(); i++) {
        sb.append("<").append(tag).append(" xsi:type='xsd:string'>").append(content.get(i))
            .append("</").append(tag).append(">");
        tag = "string" + i;
      }
      URL url = new URL(String.format(callURL, ip, ws));
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setRequestProperty("Content-Type",
                              "application/soap+xml; charset=utf-8");
      conn.setDoOutput(true);
      OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
      String env = String.format(envelope, wsMethod, wsClass, sb);
      wr.write(env);
      wr.flush();
      sb.setLength(0);
      if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.
            getInputStream()));
        for (String line = rd.readLine(); line != null; line = rd.readLine()) {
          sb.append(line);
        }
        wr.close();
        rd.close();
        return sb.toString();
      } else {
        throw new Exception("ErrorCode: " + conn.getResponseCode() + "\nURL: " + url +
                            "\nEnvelope: \n" + env);
      }
  }

  //for testing
  public static void main(String... args) throws Exception {
    List<String> content = Arrays.asList(
       new String[]{"D1814898", "00000000.00B2.17", "en", "en_US", "en_US", "en_US"});
    System.out.println(call("666.666.666.666:6666", "InventoryTagWebService", "getInventoryTag",
                            "inventorytag.meinefirma.com", content));
  }

}
```


----------



## Gast (20. Jan 2009)

Apache Axis2 ist zwar schön und gut, aber in Java 6 hat mittlerweile Jax-WS einzug gehalten.

Schritt 1. Man erstellt eine Fassade.
Eine Klasse die Methoden dieses Services bereitstellt.

```
public class MathService{
public int add(int z1,int z2){
//Hier könnte auch der Aufruf deines "bestimmten Programms" stehen
return z1 + z2:
}
}
```

Schritt 2.
Das ganze wird mit Annotations versehen

```
@WebService
public class MathService{
@WebMethod
public int add(int z1,int z2){
//Hier könnte auch der Aufruf deines "bestimmten Programms" stehen
return z1 + z2:
}
}
```

Schritt 3. Das Deployment

```
main(String[] args){
Endpoint endpoint = Endpoint.publish("http://localhost:1234/services",new MathService());
}
```

Die Wsdl sollte dann unter http://localhost:1234/services?wsdl verfügbar sein.


----------



## primeTimeBob (3. Feb 2009)

Also sehe ich das jetzt richtig, dass zuerst einmal das Programm, zudem ich die Schnittstelle die über SOAP verfügbar
gestellt werden soll, analysieren muss und dann ein Java Programm dazu schreiben muss und
man dann mit XML die ganze Sache in netz verfügbarstellen kann oder habe ich jetzt was falsch verstanden??


----------



## primeTimeBob (3. Feb 2009)

Ach noch was @gast

Was genau ist den bei dir mit z1 und z2 gemeint??
danke


----------



## primeTimeBob (3. Feb 2009)

Ach und kann ich jetzt das ganze in Eclipse programmieren??


----------



## foobar (3. Feb 2009)

> Was genau ist den bei dir mit z1 und z2 gemeint??


Das sind die Parameter, die addiert werden sollen.



> Ach und kann ich jetzt das ganze in Eclipse programmieren??


Ich weiß nicht, ob du das kannst, aber die technischen Voraussetzungen sind mit Eclipse gegeben *gg*


----------



## primeTimeBob (3. Feb 2009)

gibt es den ein gutes Tutorial wo sowas mit Eclipse erklärt wird??


----------



## primeTimeBob (3. Feb 2009)

Also ich versuche jetzt mal genau zu erklären was ich verstanden habe und was für fragen ich noch habe. bitte verbessert mich wenn ich was
falsch sehe.

Also ich soll eine Schnittstelle für ein Programm entwickeln das über einen WebService (SAOP) zur verfügung 
gestellt werden soll.

*Also muss ich dafür irgendwas über das Programm wissen, wenn ja was genau?*

*Ich brauche doch jetzt nichts anderes außer Eclipse und ein paar addons dafür, um darin ein dynamic web project zu 
entwickeln. * Oder brauche ich noch etwas dazu.

Ich habe mir zwar schon so einiges darüber durchgelesen, aber es steht viel über XML da usw.
Aber was genau brauche ich denn nun und wie sollte ich einfacherhalber anfangen?ß

Danke

mfg primtimebob


----------



## hoonix (3. Jan 2011)

Abend,


ich habe nun etliche Foren durchsucht und denke dass meie ne Frage hier am besten rein passen wird.

Ich bin dabei einen Client für einen Webservice zu schreiben der eine Authentfizierung mittel username und password im soap header verlangt. 
Nun habe ich  mittels wsimport die .class files importiert und kann den Service Aufrufen, jedoch bekomme ich den Error 401 da die Authentifizierung nicht stimmt. 

Wie kann ich nun den Usernametoken während mittels JavaCode setzten?

Bin über jede Anregung dankbar.

LG


----------

