# Webservice nutzen (rpc/enc style)



## 0001001 (4. Aug 2008)

Hi,

ich möchte gerade zum ersten Mal einen Webservice Client schreiben.
Dazu habe ich mir das relevante Kapitel in der Java Insel durchgelesen:
http://www.galileocomputing.de/open...18_007.htm#mj808150a8ef6d22adeba3252e88c4948d

Leider bietet der WebService (auf den ich keinen Einfluss habe) die Daten im *rpc/enc style* an. Das wsimport tool von java kann jedoch nur mit *rpc/lit und doc/lit* umgehen.

Was tun?
Gibts andere Implementierungen die mit rpc/enc umgehen können?

Vielen Dank schon mal!


----------



## rahan (6. Aug 2008)

Sorry auf deine Frage kann ich dir jetzt auch keine Antwort geben. Kann dir nur sagen wie ich meinen ersten Webservice von der Java Insel zum laufen bekommen hab. 

Du schreibst dein Webservice Klasse 

*MyWebService.java*

```
package de.rahan.ws;

/**
 * @author rboelzer
 *
 */
import javax.jws.*; 
import javax.jws.soap.SOAPBinding; 
 
@WebService(name="RahanWebServices") 
@SOAPBinding(style = SOAPBinding.Style.RPC) 
public class MyWebServices 
{ 
  @WebMethod 
  public String hello( @WebParam(name = "name") String name ) 
  { 
    return "Hello " + name + "!"; 
  } 
  @WebMethod(operationName="body-mass-index") 
  @WebResult(name = "your-bmi") 
  public double bmi( @WebParam(name="height") double height, 
                     @WebParam(name="weight") double weight ) 
  { 
    return weight / ((height * height) / 10000); 
  } 
}
```

Dann Schreibst du den Server

*PublishWsOnServer.java*

```
package de.rahan.ws;

/**
 * @author rboelzer
 *
 */
import javax.swing.JOptionPane; 
import javax.xml.ws.Endpoint; 
 
public class PublishWsOnServer 
{ 
  public static void main( String[] args ) 
  { 
    Endpoint endpoint = Endpoint.publish( "http://localhost:8080/services", 
                                          new MyWebServices() ); 
    JOptionPane.showMessageDialog( null, "Server beenden" ); 
    endpoint.stop(); 
  } 
}
```

Dann erstellst du am besten ein Commando shell file
*wsimport_create.cmd*
mit Folgendem Inhalt

```
wsimport -d  \WebServiceTest\src -keep -p de.rahan.gen.rahanws [url]http://localhost:8080/services?wsdl[/url]
pause
```
-d directory
-p package
-keep dont delete Service


Du startest den Server PublishWsOnServer.java
und führst das wsimport_create.cmd shell aus. Dann hast du 2 neue Service in de.rahan.gen.rahanws
*MyWebServicesService.java
RahanWebServices.java*

Mit den Services kannst du dann deinen Client schreiben.

*ClientForGeneratedStubs.java*

```
import de.rahan.gen.rahanws.MyWebServicesService;
import de.rahan.gen.rahanws.RahanWebServices;

/**
 * @author rboelzer
 *
 */
 
public class ClientForGeneratedStubs 
{ 
  public static void main( String[] args ) 
  { 
 
    RahanWebServices port = new MyWebServicesService().getRahanWebServicesPort(); 
    System.out.printf( "%s Your BMI is %.1f%n", 
                       port.hello( "Rahan" ), 
                       port.bodyMassIndex( 186, 100 ) ); 
  } 
}
```

Den kannst du ausführen.

Eine nette Beschreibung findest du auch hier. www.theserverside.de/webservice-in-java/

Schreib mir mal wenn du es geschafft hast einen Webservie mit *@SOAPBinding(style = SOAPBinding.Style.Document)* hinzubekommen. 
Daran scheitere ich gerade.


----------



## 0001001 (8. Aug 2008)

Ok hab das Problem gelöst.

Hier meine Lösung für alle, die einen rpc/encoded webservice abfragen wollen:

1. Holt euch den Apache Axis 1. Axis 2 unterstützt kein rpc/enc!
2. Die Client Klassen könnt ihr euch mit dem WSDL2Java Tool erzeugen lassen (siehe hier) *oder*
3. Den Request per Hand schreiben:

http://www.barbara-zengler.de/EinfachesBeispiel.html


```
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.encoding.XMLType;

import org.apache.axis.client.Call;

public class AskMyWebservice {


	public static void main(String[] args) throws Exception{

		URL url = new URL("http://www.**********");  // url zur soap anwendung
		
		// construct a call
		Call myCall = new Call(url);
		// set the URL of the call endpoint 
		myCall.setTargetEndpointAddress(url);
		// the child of the SOAP Body element should look like this:
		// <ns1:add xmlns:ns1="urn:NumberAdder"></ns1:add>				
		myCall.setOperationName( new QName("urn:NumberAdder", "getDescription") );
		// prepare the parameters for the call
		myCall.addParameter("requested_site", XMLType.XSD_STRING, ParameterMode.IN);
		myCall.addParameter("rev_id", XMLType.XSD_STRING, ParameterMode.IN);
		// set the return type of the call
		myCall.setReturnType(XMLType.SOAP_ARRAY);
		// invoke the call
		Object myParams[] = new Object[2];
		myParams[0]=(Object) new String("hansi");
		myParams[1]=(Object) new String("hinterseer");
		Object[] resp = (Object[])myCall.invoke(myParams);
		System.out.println(resp[0]);	
	}

}
```

Hoffe das hilft einigen, die das gleiche Problem hatten!


----------

