# PHP WebService aus Java aufrufen



## _Andi91 (27. Okt 2010)

Hi,

ich würde gern einen in PHP geschriebenen WebService in Java aufrufen.
Komm aber kein bisschen weiter gerade.
Habe schon den SOAP-Client aus dem Buch "JavaEE 5 Einstieg für Anspruchsvolle" probiert, einen Client aus dem Internet (mit apache SOAP, das apache SOAP Projekt findet man aber irgendwie nicht mehr) und mit einem example Client aus dem Axis Projekt.


Mein PHP Code:


```
<?php 
	function ctrl($action) 
	{ 
 		return "Action is: ".$action; 
	} 

	$server = new SoapServer("controller.wsdl"); 
	$server->addFunction("ctrl");
	$server->handle(); 
?>
```


WSDL Datei:


```
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='Controller'
  targetNamespace='http://mySite.de/Controller'
  xmlns:tns='http://mySite.de/Controller'
  xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
  xmlns:xsd='http://www.w3.org/2001/XMLSchema'
  xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
  xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
  xmlns='http://schemas.xmlsoap.org/wsdl/'> 

<message name='ctrlRequest'>
  <part name='action' type='xsd:string'/>
</message>
<message name='ctrlResponse'>
  <part name='Result' type='xsd:string'/>
</message> 

<portType name='ctrlPortType'>
  <operation name='ctrl'>
    <input message='tns:ctrlRequest'/>
    <output message='tns:ctrlResponse'/>
  </operation>
</portType> 

<binding name='ctrlBinding' type='tns:ctrlPortType'>
  <soap:binding style='rpc'
    transport='http://schemas.xmlsoap.org/soap/http'/>
  <operation name='ctrl'>
    <soap:operation soapAction='urn:Controller#ctrl'/>
    <input>
      <soap:body use='encoded' namespace='urn:Controller'
        encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    </input>
    <output>
      <soap:body use='encoded' namespace='urn:Controller'
        encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    </output>
  </operation>
</binding> 

<service name='ctrlService'>
  <port name='ctrlPort' binding='ctrlBinding'>
    <soap:address location='mySite.de/controller.php'/>
  </port>
</service>
</definitions>
```



Bei dem Axis Example kommt zB die Fehlermeldung

```
Exception in thread "main" java.io.IOException: Emitter failure.  There is an undefined binding (ctrlBinding) in the WSDL document.
Hint: make sure <port binding=".."> is fully qualified.
```



EDIT:

Habs hinbekommen. War im Endeffekt doch gar nicht so schwer. Man muss blos erst mal was brauchbares dazu finden. Client Code sieht jetzt so aus:


```
String  wsEndpoint = "http://mySite/controller.php";
    String  wsMethod   = "ctrl";
    Service service    = new Service();
    Call    call       = (Call)service.createCall();
    call.setTargetEndpointAddress( new URL( wsEndpoint ) );
    call.setOperationName( wsMethod );
    call.addParameter( "action", Constants.XSD_STRING, ParameterMode.IN );
    call.setReturnType( Constants.XSD_STRING );
    Object ret = call.invoke( new Object[] { "TestAction" } );
    System.out.println( ret );
```


----------



## dzim (27. Okt 2010)

AFAIK hättest du auch einfach mittels des Kommandos wsimport auf der Konsole dir die Java-Klassen für einen Client basteln lassen können (nutzt JAXB)...


----------



## heizer_28 (2. Dez 2011)

Es gibt noch eine Möglichkeit das zu machen (möchte wirklich keine Werbung oder so machen) es gibt einen tools namens myeclipse mit dem tool kann man sehre bequem sich eine kompleten WebService (Server oder Client) generieren , bei client muss wsdl vorhanden sein. Er ist zwar komerziel aber man kann ihm einen Monat umsonst benutzt.


----------

